C макрос / # определить отступ? - PullRequest
8 голосов
/ 06 декабря 2009

Мне любопытно, почему я вижу почти все макросы C, отформатированные так:

#ifndef FOO
#   define FOO
#endif

Или это:

#ifndef FOO
#define FOO
#endif

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

#ifndef FOO
    #define FOO
#endif

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

Это связано с проблемами переносимости между компиляторами или это просто стандартная практика?

Ответы [ 4 ]

7 голосов
/ 06 декабря 2009

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

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

4 голосов
/ 06 декабря 2009

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

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

Руководство GNU C препроцессора гласит:

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

3 голосов
/ 06 декабря 2009

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

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

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

1 голос
/ 06 декабря 2009

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

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

...