2009-12-06 3 views
8

мне очень интересно, почему я вижу почти все C макросы, отформатированные как это:C macro/# define indentation?

#ifndef FOO 
# define FOO 
#endif 

Или это:

#ifndef FOO 
#define FOO 
#endif 

Но никогда это:

#ifndef FOO 
    #define FOO 
#endif 

(кроме того, vim's = оператор считает, что первые два считаются правильными.)

Это из-за проблем с переносимостью среди компиляторов, или это стандартная практика?

ответ

4

IIRC, более старые препроцессоры C требовали, чтобы # был первым символом на линии (хотя я никогда не сталкивался с тем, у кого было это требование).

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

GNU C Preprocessor manual говорит:

директивы препроцессора линии в вашей программы, которые начинаются с '#'. Пробелы разрешены до и после «#».

+0

И есть дополнительное раздражение (например, ОП, упомянутое в вопросе), что редакторы часто имеют собственное представление о том, как условные блоки препроцессора должны быть (или не иметь) отступом. –

+1

Старый компилятор VAX C (около 1986 года) выдаст ошибку, если в директиве препроцессора не было '#' в первом столбце. –

7

Я видел, как это делается все три пути, это, кажется, вопрос стиля, а не синтаксис

Хотя, как правило, второй пример является наиболее распространенным, я видел случаи, когда первый (или третий) используется, чтобы помочь различать несколько уровней #ifdefs. Иногда логика может стать глубоко вложенной, и единственный способ понять ее с первого взгляда - использовать отступы, подобно обычной практике, чтобы отступать блоки кода между {и}.

1

Директивы препроцессора - это строки, включенные в наши программы, которые на самом деле не являются программными операторами, а директивами для препроцессора. Этим линиям всегда предшествует знак хеша (#). Пробелы разрешены до и после «#». Как только будет найден символ новой строки, считается, что препроцессорная директива завершается.

Нет другого правила, насколько это касается стандарта C/C++. Так что это остается вопросом вопроса стиля и читаемости, я видел/писал программы только вторым способом, который вы опубликовали, хотя третий кажется более читаемым.

3

Для предпочтения я использую третий стиль, за исключением включенных охранников, для которых я использую второй стиль.

Мне не нравится первый стиль на всех - я думаю о #define как инструкция препроцессора, хотя на самом деле, конечно, это не так, это # следуют инструкции препроцессора define. Но, поскольку я так думаю об этом, кажется, что они не могут их разделить. Я ожидаю, что текстовые редакторы, написанные людьми, которые выступают за этот стиль, будут иметь отступ/отступ блока, который работает с кодом, написанным в этом стиле. Но мне не хотелось бы встречаться с ним, используя текстовый редактор, который этого не сделал.

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