Комментарий после директивы препроцессора #else - PullRequest
2 голосов
/ 31 мая 2019

Это простой фрагмент кода на C, и, к моему удивлению, он успешно компилируется (по крайней мере, в Visual Studio 2012, которую я использую)

#include <stdio.h>

#define MYCONSTANT

int main(int argc, char* argv[])
{
    #ifdef MYCONSTANT // We can write anything here as comment
        printf("MYCONSTANT is defined");
    #else We can write any random words here without marking it as comment
        printf("MYCONSTANT is not defined");
    #endif

    return 0;
}

Вопрос: Можно ли что-либо писать после #else таким образом?

1 Ответ

6 голосов
/ 31 мая 2019

В стандартном C вы не можете размещать в строке все, кроме комментариев, после #else или #endif.С компилятором на моем компьютере я получаю предупреждение от вашего кода по умолчанию:

test.c: In function ‘main’:
test.c:9:11: warning: extra tokens at end of #else directive [-Wendif-labels]
     #else We can write any random words here without marking it as comment
           ^~

, и это становится серьезной ошибкой, если я запрашиваю строгое соответствие с C99.

Однако оригиналПрепроцессор "K & R" C сделал позволил произвольному тексту появляться в строке после #else и #endif, и старые программы использовали бы это.Ваш компилятор обратно совместим и позволяет этим старым программам компилироваться без ошибок.

Многие компиляторы C допускают множество вещей, которые в настоящее время считаются плохим стилем или совершенно неправильными, по умолчанию, ради разрешения старого кода.продолжать работать.Просмотрите руководство по Visual Studio и посмотрите, есть ли рекомендуемая конфигурация для новых программ.Я сам не пользуюсь VS, поэтому не могу дать более конкретного совета.

...