如何使用条件#error

How to use conditional #error

我在 c 中有一个应用程序头文件,其中提到了变量。

#VAR_X        "testData"

用户可以更改此变量,但我想将其长度限制为最大值 50.If 用户尝试使其超过 50 时,构建代码时应该会出错。

我在 application.h 中这样做过:

#define __IS_MORE            if((strlen(VAR_X) - 50) > 0) 1:0;

并在顶部的 application.c 中。

#define application.h
#if defined(__IS_MORE)
#error "Size is more than the maximum size"
#endif

但无论我在 VAR 中输入什么,我总是得到 #error 指令 "Size is more than the maximum size"

我做错了什么?

#ifdef(和 #if defined(..))是预编译器检查,如果在编译代码时定义了符号,则为真。

没关系 WHAT 您将 #define __IS_MORE 定义为,宏 IS 定义为某物,因此出现错误.

由于您的检查需要在 运行 时评估 strlen,因此您可以改为查看 assert 之类的结构来执行您的检查。

#define#if 是 C 预处理器的一部分,在编译代码之前进行评估。

#if defined(__IS_MORE) 只是评估标签 __IS_MORE 是否已经定义,它已经定义了。因此 #error 被处理。

你想做的事情(确保程序员不能定义 VAR_X 超过 50 个字符)不能在预处理器级别完成。如果需要,您最好在代码的开头放置 运行 时间检查。

在编译时,您可以使用称为静态断言的技术来完成此操作。您可以找到详细信息 here。假设 STATIC_ASSERT 宏的定义如 link 中所述,您可以执行以下操作来检查 VAR_X 是否超过长度(这里我假设 VAR_X 是一个宏,因为在#define VAR_X "...")

STATIC_ASSERT(sizeof(VAR_X) <= 50, "Size of VAR_X is more than the maximum size");

一些示例代码

#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
#define VAR_X "012345678912912"

STATIC_ASSERT(sizeof(VAR_X) <= 50, Size_of_VAR_X_is_more_than_the_maximum_size);

int main()
{
    return 0;
}