通过宏检查错误

Ken*_*nta 5 c c++ macros compiler-errors

我想编译一个时间错误检查,如下所述。但我不知道如何在里面使用它main()

#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(12);
}
Run Code Online (Sandbox Code Playgroud)

下面是提到的错误

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 : ')'
Run Code Online (Sandbox Code Playgroud)

谁能让我知道我做错了什么?

Che*_*Alf 5

编辑:这个问题最初被标记为 C++,但现在只是 C。

我不打算追逐问题的进一步根本变化。

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);
}
Run Code Online (Sandbox Code Playgroud)

用 g++ 4.7.1. 编译,生成

foo.cpp:在函数“int main()”中:
foo.cpp:4:1: 错误:可能未在“sizeof”表达式中定义类型
foo.cpp:4:21: 警告:语句无效 [-Wunused-value]

这直接说明出了什么问题。

因此,使用不同的编译器进行编译是个好主意。


可能您正在寻找compile time assertions

使用 C++11,您可以使用static_assert,例如通过宏,例如

#define STATIC_ASSERT( e ) static_assert( e, #e )
Run Code Online (Sandbox Code Playgroud)

在 C++03 中,您可以将其实现为 valid/invalid typedef,因为 atypedef可以在同一个翻译单元中重复,并且可以在类定义中使用:

#define STATIC_ASSERT( e ) typedef char staticAssert_shouldBeTrue[e? 1 : -1]
Run Code Online (Sandbox Code Playgroud)

一个问题是 g++ 有/有一个编译器错误,其中重复typedef并不总是被接受,因此需要为每个人生成一个本地唯一的名称,例如通过使用__LINE__.

但是你总是可以只使用 Boost 库中的定义,因为 Boost 支持大多数现存的编译器,并根据需要为每个编译器提供特殊的外壳。


oua*_*uah 5

首先是宏BUILD_BUG_ON_ZEROBUILD_BUG_ON_NULL如果它们的参数不同于 0.

如果宏参数是0,它们将不会触发任何编译错误,但会产生一个0forBUILD_BUG_ON_ZERO和一个(void *) 0forBUILD_BUG_ON_NULL

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

在C ++中,这些宏工作。原因是在 C++ 中,您不能在sizeof表达式中声明结构。

你没有在你的问题中提到你是用 C 还是 C++ 编译你的程序,但我强烈怀疑你是用 C++ 编译它。所以不要在 C++ 中使用这些宏。