Допустимы ли токены после #endif? - PullRequest
8 голосов
/ 11 августа 2010

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

#ifndef FOO_H_
#define FOO_H_

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

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

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

Ответы [ 4 ]

6 голосов
/ 11 августа 2010

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

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

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

5 голосов
/ 11 августа 2010

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

4 голосов
/ 11 августа 2010

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

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

И сделайте это на всем решении, и вам будет хорошо идти.

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

1 голос
/ 12 августа 2010

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

Скажите, что ваш заголовочный файл выглядит так:

#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

...