Почему никакое предупреждение с “#if X”, когда X неопределенный?

Меня задают этот вопрос много, и действительно он сводится, насколько Вы хотите играть. Я не могу сказать Вам, как масштабирование RE SubSonic комментариев разрушительного Chris Cyvas было - и я отвечал на них с тех пор: (.

соглашение - мудро перфектом, SubSonic масштабируется очень приятно. С точки зрения роста проекта - ЛЮБОЙ инструмент, который Вы используете, потребует Вашего внимания. Даже NHibernate.

я записал сообщение о том, как использовать шаблон Репозитория с DI (поскольку Вы будете с NHIb или любым инструментом в этом отношении) с SubSonic 2.1:

http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/

я также записал сообщение на работе SubSOnic:

http://blog.wekeroad.com/blog/subsonic-scaling/

Hope это помогает.

21
задан Brian Tompsett - 汤莱恩 9 June 2016 в 16:24
поделиться

4 ответа

gcc может генерировать предупреждение об этом, но, вероятно, этого не требует стандарт:

-Wundef
Предупреждать, если неопределенный идентификатор оценивается в директиве `#if '.

31
ответ дан 29 November 2019 в 06:56
поделиться

Компилятор не сгенерировал предупреждение, потому что это директива препроцессора. Он оценивается и разрешается до того, как компилятор его увидит.

0
ответ дан 29 November 2019 в 06:56
поделиться

Опять же, как это часто бывает, ответ на вопрос «почему» справедлив: это было сделано именно так, потому что некоторое время назад было решено сделать это именно так. Когда вы используете неопределенный макрос в #if , он заменяется на 0. Вы хотите знать, действительно ли он определен - используйте директиву defined () .

Там есть кое-что интересное тем не менее, преимущества этого подхода "по умолчанию 0". Особенно, когда вы используете макросы, которые могут быть определены платформой, а не вашими собственными макросами.

Например, некоторые платформы предлагают макросы __ BYTE_ORDER , __ LITTLE_ENDIAN и __ BIG_ENDIAN , чтобы определить их порядок байтов. Вы можете написать директиву препроцессора наподобие

#if __BYTE_ORDER == __LITTLE_ENDIAN
  /* whatever */
#else
  /* whatever */
#endif

. Но если вы попытаетесь скомпилировать этот код на платформе, которая вообще не определяет эти нестандартные макросы (т.е. ничего о них не знает), вышеуказанный код будет преобразован препроцессором в

#if 0 == 0
...

] и версия кода с прямым порядком байтов будет скомпилирована "по умолчанию". Если вы написали исходный #if как

#if __BYTE_ORDER == __BIG_ENDIAN
...

, то версия кода с прямым порядком байтов была бы скомпилирована «по умолчанию».

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

17
ответ дан 29 November 2019 в 06:56
поделиться

If I'm thinking about this correctly.

Preprocessor directives are handled before any source code is compiled. During that phase(s) of translation in which this occurs all preprocessor directives, macros, etc are handled and then the actual source code is compiled.

Since #if is used to determine if X has been defined and carry out some action if it has or has not been defined. The #if in the code snippet would compile without any errors because there aren't any errors as far as the compiler is concerned. You could always create a header file with specific #defines that your application would need and then include that header.

0
ответ дан 29 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: