Код:
#include <cstdlib>
#include <iostream>
#define PI 3.14159
using namespace std;
int main(int argc, char** argv) {
cout<<"Address of PI:"<<&PI<<endl;
return 0;
}
Вот вывод:
main.cpp: в функции int main(int, char**)':
&’
main.cpp:20: error: non-lvalue in unary
сделать [2]: * [build / Debug / Cygwin-Windows / main.o] Ошибка 1
сделать [1]: [.build-conf] Ошибка 2
делать: ** [.build-impl] Ошибка 2
Так почему я не вижу здесь адрес памяти PI?
Спасибо.
Макросам никогда не выделяется память. Перед компиляцией кода компилятор выполняет текстовый поиск в файле и заменяет все макросы их значениями. Также это текстовый поиск, поэтому текст заменяется. Таким образом, PI заменяется на 3.14 в вашем коде перед его компиляцией. В результате оператор памяти выдает ошибку, поскольку он не может получить значение 3,14, поскольку он не является переменной. Надеюсь, поможет 🙂
В вашем коде PI
не имеет адреса памяти. Поскольку это макрос препроцессора, его значение подставляется везде PI
появляется в вашей программе.
Если вы превратили его в переменную, вы сможете взять его адрес:
const double PI = 3.1415926;
Вы не можете взять адрес числового литерала. Вы могли бы для переменной, хотя:
// #define PI 3.14159
static const double PI = 3.14159;
Препроцессор заменит PI
от 3.14159
везде в вашем коде. Следовательно, номер не находится в памяти.