如何使用条件#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;
}
我在 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;
}