Должны ли инструкции препроцессора быть в начале строки?

Некоторое время назад я обнаружил (довольно древний) компилятор C, который сканировал макросы таким образом (псевдокод):

 if line.startswith("#include") or line.startswith("#define"):
     ...

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

void stuff()
{
#if defined(WIN32) || defined(_WIN32)
    ...
#else
#if defined(__GNUC__)
    ...
#else
    ...
#endif
#endif
}

Или, скорее, так (как это делается для улучшения читаемости):

void stuff()
{
    #if defined(WIN32) || defined(_WIN32)
    ...
    #else
    #   if defined(__GNUC__)
    ...
    #   else
    ...
    #   endif
    #endif
}

Можно ли унифицировать стандартный код препроцессора, то есть независимо от того, как я его отступ, он всегда будет работать одинаково?

Ответы

Ответ 1

Некоторые старые компиляторы C требовали, чтобы #define (например) был заподлицо с левым полем:

#define FOO bar

Другие компиляторы C требовали только, чтобы # находился на левом поле, чтобы вы могли:

#    define FOO bar

Новые компиляторы C обычно принимают # после любого ведущего пробела:

    #define FOO bar

Если вам нужна совместимость с такими старыми компиляторами, вы должны по крайней мере поместить свой # в первый столбец. Если совместимость не имеет значения, то это зависит от вас.

Я обычно старался не вставлять #ifdef блоки внутри функций, поэтому весь вопрос о том, должны ли они быть отступом, в основном уходит.

Ответ 3

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

Обычно они помещаются в начало строки, потому что они не подвержены областям, в которые они входят, поскольку они предварительно обработаны до фактического кода C.

Ответ 4

Не имеет значения. См. Так, если код не был идентифицирован, и в 1 строке он все равно должен компилироваться (только код, препроцессор/включает в себя какие-то другие вещи, нуждается в отдельной строке).

Изменить: похоже, что действительно старый компилятор придирчив к этому. Препроцессор должен быть в одной строке, как и другие некодовые вещи, такие как

Ответ 5

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