2014-01-27 2 views
3

(я работаю над SDK, в котором у меня есть код конкретного SDK в ссылке, и я не в состоянии проследить поток программы.)Что означают скобки в #if определенном операторе препроцессора?

Что

#if defined (AR7x00) 

означает? В частности, какова цель скобок в таком предпроцессорном операторе?

+7

добавляет круглые скобки вокруг 'AR7x00'. Его цель - предотвратить безумие. Если вы не знаете, что представляет собой пара круглых скобок на C, тогда прочитайте K & R. –

+7

Этот вопрос не соответствует теме, поскольку он не демонстрирует каких-либо знаний об используемом языке. –

+4

BTW, '# define' не является инструкцией, это директива препроцессора. –

ответ

2

В документе gnu.org online docs указано, что вы можете использовать defined с круглыми скобками или без них.

От MSDN entry for #if:

You can also group symbols and operators with parentheses.

Скобки ничего, кроме групповых символов и операторов вместе, чтобы изменить приоритет не делать.

+2

Ни GNU, ни Microsoft не определяют язык C. –

+0

@ KeithThompson, да, согласен, просто указывая на него разные источники информации, чтобы он мог получить более подробную информацию. –

7

Эти три директивы препроцессора:

#if defined (AR7x00) 

#if defined AR7x00 

#ifdef AR7x00 

все означают одно и то же самое: что следующий код должен быть обработан только если макрос AR7x00 в настоящее время определяется.

Директива #ifdef ... - это просто удобная альтернатива #if defined .... Существует также #ifndef ... директива; #ifndef FOO эквивалентно #if ! defined FOO.

Что касается круглых скобок, то синтаксис для оператора defined допускает либо идентификатор, либо идентификатор в круглых скобках без разницы в значении. Я не совсем уверен, почему скобки необязательны; Я подозреваю, что это просто исторический. (Ссылка языка в 1978 году первого издания K&R не упоминает оператор defined. Второе издание показывает обе формы, с и без скобок.)

Строго говоря, это не группируя скобки вида вы видите обычные выражения; они являются частью синтаксиса оператора defined, который может использоваться только в предпроцессорах #if. В частности, это:

#if defined ((AR7x00)) 

является синтаксической ошибкой.

+0

спасибо за то, что поделились достойными знаниями, но я пытаюсь изменить код sdk для набора моих подробностей, поэтому, когда я прошел через код sdk, я не нашел, где макрос AR7X00 или (AR7X00), если на то пошло, не определяется как таковой. так что возможно, что разработчики sdk скрывают это определение макроса даже из файлов заголовков ...? –

+0

@TrilokM: Это может быть предопределено компилятором, возможно, с помощью опции командной строки, такой как '-DAR7X00', или это может быть * не *, и это то, что проверяет' # ifdef'. –

+0

спасибо. Я работаю на сетевых устройствах, в которых есть два типа чипсетов, а именно AR7400 и INT6400, поскольку чипсеты предопределены компилятором, и я должен предоставить параметр -DAR7X00 только при компиляции.? потому что код дает ошибку во время компиляции. –

1

Я думаю, что скобки более важны при использовании нескольких условных выражений в препроцессоре. Например следующее условное выражение

#if defined(foo) || defined(bar) 
#error SOME PROBLEM 
#endif 

оценивает по-разному в моей гну-руки-НКУ окружающей среды, чем это один

#if defined foo || defined bar 
#error SOME PROBLEM 
#endif 

Первый пример делает то, что я ожидал, в то время как другой, кажется, не всегда независимо от того, установлены ли маркеры «foo» и/или «bar» #defined.

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

  • Нет связанных вопросов^_^