如果大括号未在文件末尾关闭(C+;+;),则引发编译错误 如果C++编译器在没有所有的括号被关闭的情况下到达文件的末尾,有没有提高警告或错误的方法?我们从不使用将作用域溢出到另一个文件中的头文件,并且希望在意外情况下收到编译器警告。编译器MSVC 2010,但其他可能也感兴趣 // Utilities.hpp namespace example { class Utilities { } //<EOF> -> should warn or error //Utilities.hpp 名称空间示例 { 类实用程序 { } //->应发出警告或出错

如果大括号未在文件末尾关闭(C+;+;),则引发编译错误 如果C++编译器在没有所有的括号被关闭的情况下到达文件的末尾,有没有提高警告或错误的方法?我们从不使用将作用域溢出到另一个文件中的头文件,并且希望在意外情况下收到编译器警告。编译器MSVC 2010,但其他可能也感兴趣 // Utilities.hpp namespace example { class Utilities { } //<EOF> -> should warn or error //Utilities.hpp 名称空间示例 { 类实用程序 { } //->应发出警告或出错,c++,visual-studio-2010,visual-c++,compiler-errors,C++,Visual Studio 2010,Visual C++,Compiler Errors,编辑:我愿意在每个文件的末尾放一个marker/pragma/Macro,我知道大括号的级别应该是0。原则上,编译器本身并不知道这一点-预处理器与编译器本身有足够的独立性,不同的文件“不知道”,就编译器而言,它只是一个很长的源代码流 这里的问题之一是“对源代码的理解”在不同的层次上是不同的。将#include…插入源流的预处理器除了“它们不是字母数字”之外,对{和}一无所知(这会影响宏和它是如何处理的),并且考虑到你可以[甚至可能是个坏主意]: #define START { #define

编辑:我愿意在每个文件的末尾放一个marker/pragma/Macro,我知道大括号的级别应该是0。

原则上,编译器本身并不知道这一点-预处理器与编译器本身有足够的独立性,不同的文件“不知道”,就编译器而言,它只是一个很长的源代码流

这里的问题之一是“对源代码的理解”在不同的层次上是不同的。将
#include…
插入源流的预处理器除了“它们不是字母数字”之外,对
{
}
一无所知(这会影响宏和它是如何处理的),并且考虑到你可以[甚至可能是个坏主意]:

 #define START {
 #define END }

 start
   ... 
   ...
 end
(C预处理器可以用于C代码以外的其他用途,因此它并不“意味着”理解它正在编译的语言)


我想你可以编写一个小工具来解析代码,只计算
{
}
的数量,并检查是否相等[你必须注意引号和注释,但其他一切都应该计算在内]但当然,编译器最终会以某种方式告诉您,所以我不确定这是否有多大用处。这假设宏中没有不均匀的大括号集。

一个合理的方法是

#define AT_GLOBAL_SCOPE namespace { }

因为它只能出现在全局或命名空间范围内。因此,很遗憾,它无法从另一个命名空间中捕获丢失的},但它将捕获类大小写以及丢失的括号和分号。

有趣的问题。我不知道答案,但如果您没有找到,您可以构建一个计算{和}的小工具并确保它们是相同的。如果你有一个像Jenkins这样的自动构建工具,你可以将它添加到Jenkins中。我知道这不是你想要的,但如果你没有找到真正的解决方案,我会想到一些东西。如果你有一个像Jenkins这样的工具,只要在头文件上调用编译器(!)Jenkins的想法不错,但我主要希望在编写unity builds的开发过程中使用它。如果50个cpp文件被浓缩,则很难找到失控。即使编译器不知道EOF,它能知道大括号在某个点(#Pragma?)打开吗问题不在于知道EOF,而是了解特定的包含文件的开始和结束,从编译器理解C或C++的部分,该信息不可用。在包含预处理器的集成编译器中(至少像CLAN和GCC)Mats:我的意思是,我可以告诉编译器,这是一个包含文件的结尾,把一个标记/macro/pragma放在那里,这样编译器就可以知道了。我们可以通过类似:
int-test;namespace-eof这样的方式来捕捉名称空间失控吗guard{int testB=::test;}
?需要为每个文件的测试使用唯一的名称,但。。。