Директива препроцессора #if - PullRequest
0 голосов
/ 25 ноября 2011

Я пишу большой код, и я не хочу, чтобы все это было в моем main.c, поэтому я написал файл .inc, содержащий оператор IF-ELSE с функцией, и мне было интересно, можно ли его написать так:

#if var==1
process(int a)
{
    printf("Result is: %d",2*a);
}
#else
process(int a)
{
    printf("Result is: %d",10*a);
}
#endif

Я пытался скомпилировать его, но он выдает ошибки или, в лучшем случае, он просто запускает первую функцию process без проверки переменной var (для нее установлено значение 0).

Ответы [ 3 ]

6 голосов
/ 25 ноября 2011

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

В состоянии препроцессора #if вы можете оценивать только #define 'd символов и константных выражений.

Конкретный пример, который вы показываете, может быть просто преобразован в:

printf("Result is: %d", (var == 1 ? 2: 10) * a);
0 голосов
/ 05 апреля 2012

Это то, что вы хотите:

process(int a)
{
   if (var == 1)
      printf("Result is: %d",2*a);
   else
      printf("Result is: %d",10*a);
}

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

0 голосов
/ 26 ноября 2011

Просто для завершения. Для стандартного соответствующего компилятора ваш код всегда будет корректным. В #if вычислениях выражений все идентификаторы, которые не известны препроцессору, просто заменяются на 0 (или, если хотите, на false). Так что в вашем конкретном случае, если var - это просто переменная, а не макрос, результатом всегда будет вторая версия вашей функции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...