подстановка макросов - PullRequest
       3

подстановка макросов

1 голос
/ 26 марта 2011
# include <stdio.h>
# define ONE 1
# define TWO 2
# define ONE TWO
# define TWO ONE
int main ( void )
{
  printf("ONE = %d, TWO = %d\n", ONE, TWO );
  return 0;
}

что на самом деле происходит, когда мы пишем таким образом? В 4-й строке #define ONE TWO заменяет ли предварительный процессор вслепую как 1 2 немедленно?

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Если вы используете xcode 3, вы можете щелкнуть правой кнопкой мыши на файле и выбрать PreProcess

. Вы получите огромный файл с этим кодом в конце

int main ( void )
{
 printf("ONE = %d, TWO = %d\n", ONE, TWO );
 return 0;
}

Редактировать: я вижу, что это бесполезно в этом случае.По какой-то причине препроцесс происходит без ошибок и предупреждений, но код не меняется.Но если вы пишете полезный код, вы можете посмотреть на предварительно обработанный код.


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

test.c:4:1: warning: "ONE" redefined
test.c:2:1: warning: this is the location of the previous definition
test.c:5:1: warning: "TWO" redefined
test.c:3:1: warning: this is the location of the previous definition
test.c: In function ‘main’:
test.c:8: error: ‘ONE’ undeclared (first use in this function)
test.c:8: error: (Each undeclared identifier is reported only once
test.c:8: error: for each function it appears in.)
test.c:8: error: ‘TWO’ undeclared (first use in this function)
0 голосов
/ 07 января 2012

В 4-й строке #define ONE TWO препроцессор заменяет его вслепую как 1 2 немедленно?

Нет.Соответствующая форма директивы define в этом случае:

#define идентификатор замены списка новой строки

... и замены нетпроисходит identifier.Также применимо следующее:

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

... что делает ваше переопределение незаконным.

Если вам нужно переопределить макрос, сначала вы должны отменить его определение, используя #undef.

0 голосов
/ 26 марта 2011

конфликт, из которого будет вызван макрос, возникнет ..... поскольку ONE равен 1, а ONE равен TWO .... это ошибка связывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...