C语言 如何在编译期间检查带有括号和类型转换的宏的值?

tp5buhyn  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(125)

我在一个嵌入式系统上运行C,我想确保某个#define的值等于一个特定的值,如果不是,我希望编译器失败,不能继续。
我的代码目前看起来像这样:

typedef uint32_t TickType_t; //I can NOT change/modify this typedef
#define configTICK_RATE_HZ  ( ( TickType_t ) 1000 ) //I can NOT change/modify this macro, it's autogenerated

然后我尝试在代码中执行以下操作:

#if(1000 != configTICK_RATE_HZ)
    #error "configTICK_RATE_HZ is not 1000Hz!"
#endif

我在构建过程中遇到了一个错误,因为#if不喜欢看到类型转换(编译器不知道typedef)。我发现了一个关于如何剥离/删除类型转换(link)的stackoverflow讨论,有一个非常有创意的答案,但对我来说还不太有效,因为我认为我需要在使用这个创造性的解决方案之前首先删除原始宏的最外括号。
换句话说,我想要这个的 * 预处理器 * 输出:
#if(1000 != configTICK_RATE_HZ )
看起来像这样:#if(1000 != 1000)
而不是像这样#if(1000 != ( ( TickType_t ) 1000 ) )
如果需要,我不介意中间宏,但我不能更改原始的“configTICK_RATE_HZ”定义或TickType_t的typedef
下面是一些最小的可复制代码(一个类似的问题,涵盖了我遇到的相同问题)。下面的代码失败,因为它不喜欢宏中的类型转换或最外面的括号。

#include <stdio.h>
#define FREQ_HZ ((int)10) //Can not modify this definition

#if( 10 != FREQ_HZ )
#error "Bad frequency value"
#endif

int main(void)
{
    printf("Hello world\n");
}
qyswt5oh

qyswt5oh1#

你不能使用预处理器,但是你可以使用静态Assert。
static_assert声明允许在编译时检查常量表达式,如果条件为false,则使用给定的文本生成错误。

static_assert(1000 == configTICK_RATE_HZ, "configTICK_RATE_HZ is not 1000Hz!");

相关问题