Странная ошибка с #define в c - PullRequest
0 голосов
/ 15 июля 2011

Я знаю, что #define заменяется перед компиляцией в реальные значения.так почему первый код здесь компилируется без ошибок, а второй нет?

1-й;

#include <stdio.h>
#include <stdlib.h>
int main()
{
   printf("bc");
   return 0;
}

2-й (не работает);

#include <stdio.h>
#include <stdlib.h>
#define Str "bc";
int main()
{
   printf(Str);
   return 0;
}

error: expected ')' before ';' token

спасибо за ответы, и извините за мой плохой английский ...

Ответы [ 7 ]

4 голосов
/ 15 июля 2011

Поскольку макрос Str оценивается как "bc"; - точка с запятой включена.Таким образом, ваш макрос расширяется до:

printf("bc";);

Вам не нужно следовать #define с точкой с запятой.Они заканчиваются символом новой строки, а не точкой с запятой.Это сбивает с толку, я знаю;препроцессор С - странный зверь, изобретенный до того, как люди узнали лучше.

4 голосов
/ 15 июля 2011

На самом деле второй работает, а первый нет. Проблема в точке с запятой:

#define Str "bc";
                ^
3 голосов
/ 15 июля 2011

Проблема с первым состоит в том, что Str заменяется на "bc";.

Измените его на

#define Str "bc"
3 голосов
/ 15 июля 2011

Используйте

#define Str "bc"

с вашим определением после подстановки это будет выглядеть так:

printf("bc";);
2 голосов
/ 15 июля 2011

Вам необходимо удалить; где вы определяете ул. Потому что вы получите printf ("bc";);

1 голос
/ 15 июля 2011

Первая не работает, потому что эти строки:

#define Str "bc";
printf(Str);

развертываются до этой строки:

printf("bc";);

Вы хотите:

#define Str "bc"
1 голос
/ 15 июля 2011

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

...