【宏定义】——编译时检查(一)

编译时校验

功能描述

用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错

反之如果条件为假,则编译正常,且有返回值,返回 0。

代码实现

/*
 * Force a compilation error if condition is true, but also produce a
 * result (of value 0 and type int), so the expression can be used
 * e.g. in a structure initializer (or where-ever else comma expressions
 * aren't permitted).
 */
#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct {
      
       int:(-!!(e)); })))

参数 e 表示用于判断的表达式

示例代码

正常编译示例

#include <stdio.h>

#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct {
      
       int:(-!!(e)); })))

int main(void)
{
    
    
    printf("Compilation successful %d.\n", BUILD_BUG_ON_ZERO(0));

    return 0;
}

结果打印

Compilation successful 0.

编译错误示例

#include <stdio.h>

#define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct {
      
       int:(-!!(e)); })))

int main(void)
{
    
    
    printf("Compilation successful %d.\n", BUILD_BUG_ON_ZERO(1));

    return 0;
}

编译错误信息

test.c: In function ‘main’:
test.c:3:51: error: negative width in bit-field ‘<anonymous>3 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct {
    
     int:(-!!(e)); })))
      |                                                   ^
test.c:7:44: note: in expansion of macro ‘BUILD_BUG_ON_ZERO’
    7 |     printf("Compilation successful %d.\n", BUILD_BUG_ON_ZERO(1));

预处理之后的结果

gcc -E test.c -> test.i
int main(void)
{
    
    
    printf("Compilation successful %d.\n", ((int)(sizeof(struct {
    
     int:(-!!(1)); }))));

    return 0;
}

代码解析

!!e

对条件 e 进行两次逻辑非运算,得到 逻辑值 结果 0 或者 1。如果表达式 e 的结果为 0 ,则得到 0 , 如果为非 0 值,则得到 1 。

struct {int:-!!(e); }

如果表达式 e 的结果为 0,则得到结构体 struct {int:0;},这是一个匿名的位域结构体,位域宽度为 0。

如果表达式 e 的结果为 1,则得到结构体 struct {int:-1;},则编译错误。由于位域的宽度不能是负的,所以编译错误,提示错误 error: negative width in bit-field <anonymous>

sizeof(struct {int:-!!(e); })

如果表达式 e 的结果为 0,则使用 sizeof 运算符计算得到这个匿名结构体 struct {int:0;} 的大小为 0,宏的返回值为 0。

参考代码

  • https://blog.csdn.net/u012028275/article/details/127478561

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/131979287