我在c中有一个应用程序头文件,我提到了变量。
#VAR_X "testData"
用户可以更改此变量但我想将其长度限制为最大值50.如果用户尝试使其超过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指令"尺寸大于最大尺寸"
我做错了什么?
答案 0 :(得分:4)
在编译时,您可以使用一种名为static assert的技术来完成此操作。你可以找到详细信息here。假设按照链接中的说明定义了STATIC_ASSERT宏,您可以执行以下操作来检查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;
}
答案 1 :(得分:1)
#define
和#if
是C预处理器的一部分,在编译代码之前会进行评估。
行#if defined(__IS_MORE)
只是评估标签__IS_MORE
是否已定义。因此,处理了#error
。
您希望做的事情(确保程序员无法定义超过50个字符的VAR_X
)无法在预处理器级别完成。如果需要,您可以做的最好的事情是在代码的开头进行运行时检查。
答案 2 :(得分:0)
#ifdef
(和#if defined(..)
)是预编译器检查,如果符号是在编译代码时定义的,则为真。
WHAT 定义#define __IS_MORE
无关紧要,宏 IS 定义为某种东西,因此错误。
由于您的检查需要在运行时评估strlen
,因此您可以查看类似assert
的结构来强制执行检查。