2010-08-11 77 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 2010-08-11 18:46:52

+0

我试图问一下标准是否可以接受 - 或者如果它是特定的实现或其他 - 我不太确定。也许最好的措辞应该是“这是正确的吗?” - 无论哪种方式,当应用程序在其他操作系统上编译时,我不希望发出警告,因此我将删除它们 - 谢谢。 – 2010-08-11 18:52:17

+0

@Joe:对不起,我看错了这个问题。 – GManNickG 2010-08-11 18:53:00

回答

6

严格地说(根据标准中的语法),在同一行上的#endif指令后面不允许使用标记(注释是可以的,因为它们在翻译的早期阶段被移除,而不是预处理指令 - 阶段3与4)。

但是,MSVC似乎允许它 - 我不会去寻求解决这些问题(因为它们不会导致问题),但可能会在修改头文件时修复它们拥有他们。

当然,如果您的其他支持的编译器发布有关它们的诊断信息,修复它们可能更加紧迫。

+0

我的主要担心是,当应用程序被移植到其他操作系统的时候,如果这种行为不被允许,可能会导致一些事情,因为它不是我只会修复它。无论如何不应该花太长的时间。虽然谢谢! – 2010-08-11 18:54:34

5

这是不好的,它是无效的,AFAIK。许多编译器忽略了#endif之后的额外文本,并经常提醒他们。您应该添加//以使其成为评论。

+0

好的,我不想看到任何警告,所以我会回去修复它,谢谢! – 2010-08-11 18:53:07

4

与其他人发布的内容一样,我想我可能会帮助您实际纠正问题。 (假设它在很多文件中)。

您可以使用visual studio中的查找和替换功能一次性更正所有有问题的行。只需设置查找内容:至"\#endif {[a-zA-Z\.\_]+}$"并替换为:至"#endif //\1"(并确保您有使用:[正则表达式]在查找选项下进行检查。)

并且在整个解决方案上做到这一点,您应该很好。

(请备份您的第一个项目,我已经测试了这一点,它似乎打算,但需要您自担风险使用此奏效。)

+0

哦,现在这真棒,我不知道你可以在查找和替换框中使用正则表达式。虽然我对他们不是很好,但它告诉我“模式中出现语法错误”并突出显示“#endif {[a-zA-Z ._] +} $” - 我在做什么不正确? - 编辑:哎呀,不能使用那里的#或者打破它。它现在正在工作,非常感谢你! – 2010-08-11 19:04:35

+0

在#前面应该有斜杠(\),。和_。不知道为什么他们被删除? (像这样:\ #endif {[a-zA-Z \。\ _] +} $) – TJMonk15 2010-08-11 19:06:37

+0

@ Joe.F它在_之前删除了那个。不知道为什么。只需添加它,你就会很好。 – TJMonk15 2010-08-11 19:07:14

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之后的东西