Макросы препроцессора C - определение и переносимость значений и практика - PullRequest
5 голосов
/ 10 марта 2012

Для кода, специфичного для компилятора, обычно встречаются директивы cpp, такие как:

#if defined (__GNUC__) && (__GNUC__ >= 4)

, который я обычно использую в качестве теста препроцессора - не только для __GNUC__, ноэто общий пример.В качестве альтернативы

#if (__GNUC__ >= 4)

, по-видимому, удовлетворяет тем же требованиям.Есть ли потенциальные проблемы с последним?Не только с gcc, но и с любым соответствующим стандартам препроцессором.Может ли LHS оцениваться как определенное значение, даже если оно не определено?Есть ли какие-либо подводные камни во втором подходе, о которых знают любые языковые юристы?

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Предпроцессор предполагает, что неопределенные макросы имеют значение 0 в сравнениях, так что в этом случае ваше упрощение в порядке.Если вы хотите проверить в gcc более низкую версию, чем 4, вы можете столкнуться с проблемами, поскольку она будет оцениваться как true с <, даже если это не gcc.

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

#if defined(__GNUC__) && (__GNUC>=4)

, то вполне очевидно, что вы не уже в блоке с кодом, предназначенным только для GCC, в то время как упрощение

#if (__GNUC__ >= 4)

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

2 голосов
/ 10 марта 2012

В случае GNUC, когда вы тестируете его с другой стороны, это будет неправильно:

#if (__GNUC__ < 4)

Я думаю, что это будет верно, даже если GNUC не определена.

...