我在嵌入式系统上运行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不喜欢看到类型转换(编译器不知道类型转换)。我发现了一个关于如何剥离/删除类型转换(链接)的stackoverflow讨论,有一个非常有创意的答案,但它还不太适合我,因为我认为我需要在使用该创意解决方案之前先从原始宏中删除最外面的括号。
问另一种方式,我想要预处理器的输出:
#if(1000 != configTICK_RATE_HZ )
看起来像这样:#if(1000 != 1000)
而不是这样:#if(1000 != ( ( TickType_t ) 1000 ) )
如果需要,我不介意中间宏,但我不能改变原来的"configTICK_RATE_HZ"TickType_t的定义或类型定义
这里有一些最小的可重现代码(一个类似的问题,涵盖了我遇到的相同问题)。下面的代码失败了,因为它不喜欢宏中的类型转换或最外面的括号。
#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 worldn");
}
不能使用预处理器,但可以使用静态断言。
static_assert
声明允许在编译时检查常量表达式,如果条件为false,则对给定的文本生成错误。
static_assert(1000 == configTICK_RATE_HZ, "configTICK_RATE_HZ is not 1000Hz!");