Указатель на #define - PullRequest
       3

Указатель на #define

4 голосов
/ 17 декабря 2010

Мне было просто любопытно узнать, можно ли получить указатель на константу #define.Если да, то как это сделать?

Ответы [ 5 ]

12 голосов
/ 17 декабря 2010

Директива #define является директивой препроцессору , что означает, что она вызывается препроцессором еще до того, как что-либо скомпилировано.

Поэтому, если вы наберете:

#define NUMBER 100

А потом вы набираете:

int x = NUMBER;

То, что на самом деле ваш компилятор видит , просто:

int x = 100;

По сути, вы открыли свой исходный код в текстовом процессоре и выполнили поиск / замену, чтобы заменить каждое вхождение «NUMBER» на «100». Таким образом, ваш компилятор не имеет представления о существовании NUMBER. Только препроцессор предварительной компиляции знает, что означает NUMBER.

Итак, если вы попытаетесь получить адрес NUMBER, компилятор подумает, что вы пытаетесь получить адрес целочисленной литеральной константы, которая недопустима.

11 голосов
/ 17 декабря 2010

Нет, потому что #define предназначен для замены текста, поэтому вы не можете получить указатель на переменную - то, что вы видите, на самом деле заменяется определением #define перед передачей кода вкомпилятор, так что нет ничего, чтобы взять адрес.Если вам нужен адрес константы, определите вместо нее переменную const (C ++).

Обычно считается хорошей практикой использовать константы вместо макросов, поскольку они фактически представляют переменные с ихсобственные правила определения объема и типы данных.Макросы являются глобальными и не имеют типов, и в большой программе могут легко запутать читателя (поскольку читатель не видит, что на самом деле там).

3 голосов
/ 17 декабря 2010

#define определяет макрос. Макрос просто вызывает замену одной последовательности токенов другой последовательностью токенов. Указатели и макросы - совершенно разные вещи.

Если под "#define constant" вы подразумеваете макрос, который расширяется до числового значения, ответ по-прежнему нет, потому что где бы ни использовался макрос, он просто заменяется этим значением. Нет способа получить указатель, например, на номер 42.

0 голосов
/ 28 августа 2016

Есть способ преодолеть эту проблему:

#define ROW 2

void foo()
{
    int tmpInt = ROW;
    int *rowPointer = &tmpInt;
    // ...
}

Или, если вы знаете, что это тип, вы даже можете сделать это:

void getDefinePointer(int * pointer)
{
    *pointer = ROW;
}

И используйте это:

int rowPointer = NULL;
getDefinePointer(&rowPointer2);
printf("ROW==%d\n", rowPointer2);

и у вас есть указатель на константу #define.

0 голосов
/ 17 декабря 2010

Нет, это не возможно в C / C ++

Вы можете использовать директиву #define, чтобы дать значимое имя константе в вашей программе

Мы можем использовать в двух формах.

Пожалуйста: смотрите эту ссылку

http://msdn.microsoft.com/en-us/library/teas0593%28VS.80%29.aspx

Директива #define может содержать определение объекта или определение функции.

Извините, я не могу предоставить еще один миг ... Пожалуйста, смотрите ссылки IBM ... так как ниже я вставил ссылку linke

Вы можете получить полную информацию из выше 2 ссылок

...