如果C ++编译器在没有关闭所有大括号的情况下到达文件末尾,是否有办法引发警告或错误?我们从不使用将范围溢出到另一个文件中的标题,并且如果偶然发生,则希望收到编译器警告。编译器MSVC 2010,但其他人也可能会感兴趣。
// Utilities.hpp
namespace example
{
class Utilities
{
}
//<EOF> -> should warn or error
编辑:我愿意在每个文件的末尾添加一个marker / pragma / Macro,我知道大括号应为0。
答案 0 :(得分:2)
合理的方法是
#define AT_GLOBAL_SCOPE namespace { }
因为它只能出现在全局或命名空间范围内。所以不幸的是,它不会从另一个命名空间中捕获那个丢失},但它会捕获类大小写,以及缺少括号和分号。
答案 1 :(得分:1)
原则上,编译器本身并不知道 - 预处理器与编译器完全分开,不同的文件是&#34;未知&#34;,它只是一个长流源代码,就编译器而言。
这里的一个问题是对源代码的理解&#34;在不同的层次上是不同的。将#include ...
插入到源流中的预处理器除了&#34之外,其他方式并不真正了解{
和}
的任何内容;它们不是字母数字&#34; [影响如何处理宏等)。并且考虑到你可以[即使它可能是一个坏主意]:
#define START {
#define END }
start
...
...
end
(C预处理器可以用于除C代码之外的其他内容,因此它不是&#34;意味着&#34;了解它正在编译的语言)
我想你可以编写一个小工具来解析代码并只计算{
并向下计算}
,并检查是否相等[你必须关心引号和注释,但其他一切应该算一算]。但是当然,编译器最终会以某种方式告诉你,所以我不确定它有多大用处。这假设宏中没有不均匀的大括号。