2013-06-09 6 views
0

Когда мы не даем значение в макроподстановке.Значение макроса не определено

#define YES 
printf("%d",YES) 

Значение YES не указано, по умолчанию 0 или мусор?

+1

Почему бы не попробовать компилировать его и выяснить сами? –

+0

@PaulR Поскольку программирование путем экспериментирования с реализацией не может дать окончательного ответа. Возможно, акаш надеется, что кто-то цитирует главу и стих из более авторитетного документа. – Jens

+1

@Jens: это может быть правдой во многих случаях, например. для неопределенного поведения, но в этом случае результирующая ошибка компилятора ответит на вопрос решительно и детерминистически. –

ответ

6

Вы только что определили ДА для ничего. Таким образом, программа результата после препроцессора должна быть printf("%d",)

1

Ни то, ни другое не имеет значения.

Такое использование, как правило, полезно в таких ситуациях:

#define _VXWORKS 

Позже, проверьте, если макрос был определен.

#ifdef _VXWORKS 
//do something 
#else 
//do something else 
#endif 
1

ничего

вы бы использовать GCC: Вы можете найти, чтобы это нравится: gcc prog.c -E -P

2

Я был бы удивлен, что он компилирует

В коде поражающего компилятора

printf("%d",) 

!!

2

Препроцессор C работает на токены. Определение макроса для YES говорит, чтобы заменить токен YES без токена, эффективно удалив токен YES. Таким образом, результат после замены макроса

printf ("%d",) 

который является синтаксической ошибкой, как вы заметили.

В отличие от неинициализированных автоматических переменных, замены макросов всегда хорошо определены, поэтому вы не можете иметь неопределенные значения («мусор») в результате расширения макросов.

+0

Не было '' 'в сообщении! –

Смежные вопросы