Маркеры после #endif законны?

Я в настоящее время делаю следующее и компилятор (MSVC2008 / а также 2010) не жалуются на это, но я не уверен, является ли это плохая идея или нет:

#ifndef FOO_H_
#define FOO_H_

// note, FOO_H_ is not a comment:
#endif FOO_H_

Я раньше всегда писал это как #endif // FOO_H_ но я поймал меня, не делая этого сегодня и думал, что это было странно, потому что, по-видимому, я не сделал метода комментария некоторое время.

Эта плохая практика то, что я должен возвратиться через все мои заголовки и зафиксировать (это - межплатформенное приложение), или это должно хорошо оставить это способом, которым это?

8
задан GManNickG 11 August 2010 в 18:54
поделиться

4 ответа

Строго говоря (согласно грамматике стандарта) после директивы #endif в той же строке нельзя использовать токены (комментарии допустимы, поскольку они удаляются на более ранней стадии перевода, чем предварительная обработка директивы - фаза 3 vs. 4).

Однако MSVC, похоже, позволяет это - я бы не стал искать их исправления (поскольку они не вызывают проблем), но, вероятно, сделаю мысленную заметку, чтобы исправить их, когда вы изменяете заголовки, которые имеют их.

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

6
ответ дан 5 December 2019 в 10:38
поделиться

С учетом того, что написали все остальные, я решил, что могу помочь вам с фактическим исправлением проблемы. (при условии, что это находится во многих файлах.)

Вы можете использовать функцию «Найти и заменить» в Visual Studio, чтобы исправить все проблемные строки сразу. Просто установите Find What: на "\ # endif {[a-zA-Z \. \ _] +} $" и Замените на: на "# endif // \ 1" (и убедитесь, что вы отметили Use: [Regular Expressions] в параметрах поиска.)

И сделайте это для всего решения, и все будет в порядке.

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

4
ответ дан 5 December 2019 в 10:38
поделиться

Почему ваш компилятор должен предупреждать вас об этом.

Допустим, ваш заголовочный файл выглядит следующим образом:

#ifndef X
#define X
// STUFF
// The next line does not contain an EOL marker (can happen)
#endif

Теперь вы включаете это из исходного кода

#include "plop.h"
class X
{
}

Когда компилятор включает файл технически, расширенный исходный код должен выглядеть следующим образом

#define X
// STUFF
// The next line does not contain an EOL marker (can happen)
#endif class X
{
}

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

Проблема в том, что некоторые старые компиляторы не предоставляют этот дополнительный токен (более совместимый со стандартами), но в результате вы потенциально можете скомпилировать приведенный выше код (в результате они, как правило, предупреждают вас о двух вещах: 1) отсутствует EOL в исходных файлах и 2) вещи после #endif

1
ответ дан 5 December 2019 в 10:38
поделиться

Это не нормально, это не валидно, AFAIK. Многие компиляторы игнорируют дополнительный текст после #endif, хотя часто они предупреждают об этом. Вы должны добавить //, чтобы сделать это комментарием.

5
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: