2010-08-11 4 views
8

я в настоящее время сделать следующее и компилятор (msvc2008 /, а также 2010) не жалуется на него, но я не уверен, что это плохая идея или нет:Являются ли токены после #endif законными?

#ifndef FOO_H_ 
#define FOO_H_ 

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

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

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

+0

Я получаю предупреждение с GCC (дополнительные жетоны), поэтому я бы не предложил этого. – UncleBens

+0

Я пытался спросить, приемлемо ли это для стандарта, или если это было конкретным исполнением или чем-то еще - я не совсем уверен. Может быть, лучшая формулировка была бы «это правильно?» - В любом случае я не хочу предупреждений, когда приложение компилируется на других ОС, поэтому я удалю их - спасибо. –

+0

@ Joe: Извините, я прочитал вопрос неправильно. – GManNickG

ответ

6

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

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

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

+0

Моя основная забота заключалась в том, что когда приложение переносится на другие ОС, это может вызвать что-то, если это поведение недопустимо, и поскольку это не так, я просто исправлю это. В любом случае, не стоит так долго все это переживать. Спасибо хоть! –

5

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

+0

Хорошо, я не собираюсь получать никаких предупреждений, поэтому я вернусь и исправлю это, спасибо! –

4

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

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

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

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

+0

О, теперь это потрясающе, я понятия не имел, что вы можете использовать regexp в поле поиска и замены. Я не очень хорош с ними, но он говорит мне «Синтаксическая ошибка в шаблоне» и выделяет «#endif {[a-zA-Z ._] +} $» - я что-то неправильно делаю? - edit: Упс, не могу использовать # там или он его разрывает. Сейчас он работает, большое спасибо! –

+0

перед символом #, должны быть косые черты (\). а также _. Не знаете, почему их удалили? (например: \ #endif {[a-zA-Z \. \ _] +} $) – TJMonk15

+0

@ Joe.F Удалил его перед _ там. Не знаю, почему. Просто добавьте его обратно, и вы будете хорошо. – TJMonk15

1

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

Скажите ваш файл заголовка, как это:

#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