Должны ли инструкции препроцессора быть в начале строки?
Некоторое время назад я обнаружил (довольно древний) компилятор 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
блоки внутри функций, поэтому весь вопрос о том, должны ли они быть отступом, в основном уходит.
Ответ 2
из документация по препроцессорам gcc C:
Директивы предварительной обработки - это строки в ваша программа, начинающаяся с #'. Whitespace is allowed before and after the
# '.
Ответ 3
Нет, они не должны быть в начале строки, но у них могут быть только пробелы (пробелы, табуляции,...) перед ними.
Обычно они помещаются в начало строки, потому что они не подвержены областям, в которые они входят, поскольку они предварительно обработаны до фактического кода C.
Ответ 4
Не имеет значения. См. Так, если код не был идентифицирован, и в 1 строке он все равно должен компилироваться (только код, препроцессор/включает в себя какие-то другие вещи, нуждается в отдельной строке).
Изменить: похоже, что действительно старый компилятор придирчив к этому. Препроцессор должен быть в одной строке, как и другие некодовые вещи, такие как
Ответ 5
Я не думаю, что компилятор "заботится", если у вас есть пробелы перед препроцессором - он должен быть тем же...