C++ 通过宏进行错误检查

C++ 通过宏进行错误检查,c++,c,macros,compiler-errors,C++,C,Macros,Compiler Errors,我想编译一个时间错误检查,如下所述。但是我无法找到如何在main()中使用它 下面是提到的错误 1--error C2332: 'struct' : missing tag name 2--error C2143: syntax error : missing ')' before '{' 3--error C2027: use of undefined type 'main::<unnamed-tag>' 4--error C2143: syntax error : missing

我想编译一个时间错误检查,如下所述。但是我无法找到如何在
main()中使用它

下面是提到的错误

1--error C2332: 'struct' : missing tag name
2--error C2143: syntax error : missing ')' before '{'
3--error C2027: use of undefined type 'main::<unnamed-tag>'
4--error C2143: syntax error : missing ';' before '{'
5--error C2059: syntax error : ')'
1--错误C2332:'struct':缺少标记名
2--错误C2143:语法错误:在“{”之前缺少“')”
3--错误C2027:使用未定义的类型“main::”
4--错误C2143:语法错误:在“{”之前缺少“;”
5--错误C2059:语法错误:')'

能不能让我知道我做错了什么?< /P> < P> <强>编辑< /St>:问题最初被标记为C++,但现在只是C.</P> 我不打算继续追问这个问题的根本性变化

< > C++标记问题的原始答案:


此源代码:

#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
int main(){
BUILD_BUG_ON_NULL(0);
}
用g++4.7.1编译,生成

foo.cpp: In function 'int main()': foo.cpp:4:1: error: types may not be defined in 'sizeof' expressions foo.cpp:4:21: warning: statement has no effect [-Wunused-value] 在C++03中,可以将其实现为有效/无效的
typedef
,因为
typedef
可以在同一翻译单元中重复,并且可以在类定义中使用:

#define STATIC_ASSERT( e ) typedef char staticAssert_shouldBeTrue[e? 1 : -1]
其中的一个问题是g++有一个编译器错误,重复的
typedef
并不总是被接受,这就需要为每一个生成一个本地唯一的名称,例如使用
\uu LINE\uu


但是您可以始终使用Boost库中的定义,因为Boost支持大多数现有编译器,根据需要为每个编译器提供特殊的大小写。

使用
gcc-std=c99-pedantic errors编译,我得到

c:在函数“main”中:
c:5:1:错误:位字段“”中的负宽度
c:5:1:错误:结构没有命名成员[-pedantic]
当代码编译为C时,编译应该给出这些错误。位字段的宽度必须是非负的(如果有名称,则为正),并且
struct
必须至少有一个命名成员(如果最后一个是灵活的数组成员,则为两个)。
struct
s不带标记是允许的

您要么编译的代码不是C,要么编译器不符合要求

编译为C++时,附加错误

error: types may not be defined in ‘sizeof’ expressions
已生成(但关于不带命名成员的
结构的
将消失)


在C++中,你可能无法在<代码> SigeOS/<代码>表达式中定义类型,编译器选择了一种不太清楚的方式告诉你。

< P>第一个宏:代码> BugGuangon On0和<代码> BugGuangOnLoad < /代码>如果它们的参数不同于代码> 0 >,则触发编译错误。

如果宏参数为
0
,它们将不会触发任何编译错误,但会为
BUILD\u-BUG\u-ON-ZERO
生成
0
,为
BUILD\u-BUG\u-ON-NULL生成
(void*)0

这些宏来自用C编写的Linux内核,它们只适用于C程序

在C++中,这些宏不起作用。原因是C++中不能在<代码> sieOS/<代码>表达式中声明结构。< /P>
<>你在你的问题中没有提到你是在C或C++中编译程序,但是我强烈怀疑你是用C++编译的。所以不要在C++中使用这些宏。

位字段的宽度必须是一个整数常量表达式。<代码> Valu/Cuth>不是一个。这样就不行了。D: C:5:错误:位字段的宽度不是整数常量。@丹尼尔费舍尔:我用常数值编辑了这个问题。但是它仍然显示了同样的错误。@初学者这是一个C宏,你不应该用C++编译器。如果你解释你想做什么,你会得到更好的帮助……去编译错误检查。(这不是合乎语法的英语)不知道它是不是这样。所以你在说上面的方法不是检查编译错误的正确方法吗?@学习者在程序中添加了行<代码> > IFDEF,CPLUS PLUS +错误编译器C++,使用了“NEnf<”/Cudio >,以检查你没有使用C++编译器。那么,你在编译时想要检测什么?因为你的宏的参数必须是一个Co。nstant表达式,它是相当有限的。当参数为
0
时,即使在非常严格的模式下也可以编译它。通过将命名成员添加到
结构
,您将获得“负宽度”非零参数错误。如果您只使用一个
,则会切换大小写。@ouah这应该在每个源文件的顶部;)因此您告诉我们不能使用上述思想进行编译时断言,因为类型已在sizeof()中定义表达式:@学习者:C和C++是不同的语言。以上是C++的答案。你的问题现在只被标记为C。是的,我使用C++编译器。谢谢。现在我得到了一个解决办法,它不能在C++中使用,因为没有声明在sisiof表达式中的类型。te当值为零时有错误。因此!!将非零值设为负值并获得错误。@Matstpeterson您应该再次阅读宏定义:编译错误在宏参数为非零时完成。
!!
习惯用法用于规范布尔参数:
0
转到
0
和非-零转到
1
。这些宏的名称背后的想法都是
BUILD\u BUG\u ON*
宏在参数为true时触发编译错误。后缀
与条件无关,但与宏参数为false时产生的值有关。无论如何,我发现这些宏的名称有误导性。好的,yes、 你说得对。早上太早了…)我在想Linux宏,它肯定是BUG__ON(truthvalue)-如果truthvalue为true,那么它会停止内核。
#define STATIC_ASSERT( e ) typedef char staticAssert_shouldBeTrue[e? 1 : -1]
error: types may not be defined in ‘sizeof’ expressions