C 如何使用条件错误
我有一个c语言的应用程序头文件,其中提到了变量C 如何使用条件错误,c,error-handling,compiler-errors,pragma,build-error,C,Error Handling,Compiler Errors,Pragma,Build Error,我有一个c语言的应用程序头文件,其中提到了变量 #VAR_X "testData" 用户可以更改此变量,但我想将其长度限制为最大50。如果用户试图使其超过50,则在生成代码时应出错 我在申请表中已经这样做了。h: #define __IS_MORE if((strlen(VAR_X) - 50) > 0) 1:0; 在应用程序中,c位于顶部 #define application.h #if defined(__IS_MORE) #error "Si
#VAR_X "testData"
用户可以更改此变量,但我想将其长度限制为最大50。如果用户试图使其超过50,则在生成代码时应出错
我在申请表中已经这样做了。h:
#define __IS_MORE if((strlen(VAR_X) - 50) > 0) 1:0;
在应用程序中,c位于顶部
#define application.h
#if defined(__IS_MORE)
#error "Size is more than the maximum size"
#endif
但无论我在VAR中输入什么,我总是得到#error指令“Size大于最大Size”
我做错了什么?\ifdef
(和\if defined(…)
)是预编译器检查,如果符号是在代码编译点定义的,则为真
定义什么并不重要,因为宏被定义为某物,因此会出现错误
由于您的检查需要在运行时对strlen进行评估,因此您可以查看类似于强制检查的构造。\ifdef(和\if defined(…)
)是预编译器检查,如果在编译代码时定义了符号,则为true
定义什么并不重要,因为宏被定义为某物,因此会出现错误
由于您的检查需要在运行时对strlen进行评估,因此您可以查看类似于强制检查的构造。\define
和\if
是C预处理器的一部分,并且在编译代码之前进行评估
行#if defined(u IS _MORE)
仅计算标签u IS _MORE
是否已定义,它已定义。因此,将处理#错误
您想要做的事情(确保程序员不能定义超过50个字符的VAR\ux
)不能在预处理器级别完成。如果需要,最好是在代码的开头进行运行时检查。#定义和#如果是C预处理器的一部分并且在编译代码之前进行评估
行#if defined(u IS _MORE)
仅计算标签u IS _MORE
是否已定义,它已定义。因此,将处理#错误
您想要做的事情(确保程序员不能定义超过50个字符的VAR\ux
)不能在预处理器级别完成。如果需要的话,最好是在代码的开头进行运行时检查。在编译时,可以使用称为静态断言的技术来实现这一点。你可以找到细节。假设按照链接中的说明定义了静态_ASSERT宏,您可以执行以下操作来检查VAR_X是否超过长度(这里我假设VAR_X是一个宏,如#define VAR_X“…”)
STATIC_ASSERT(sizeof(VAR_X)在编译时,您可以使用一种称为STATIC ASSERT的技术来实现这一点。您可以找到详细信息。假设一个STATIC_ASSERT宏是按照链接中的说明定义的,您可以执行以下操作来检查VAR_X是否超过了长度(这里我假设VAR_X是一个宏,如#define VAR_X“…”)
STATIC\u ASSERT(sizeof(VAR\u X)似乎不起作用。或者我在这里遗漏了什么。是否“sizeof”也扩展为某个宏?一个宏由预处理器用其内容替换。编译器将其视为sizeof(“testData”)并且不知道宏的扩展。我复制粘贴了一些示例工作代码。似乎不起作用。或者我在这里遗漏了什么。是否“sizeof”也扩展为某个宏?一个宏被预处理器替换为其内容。编译器将其视为sizeof(“testData”)不知道宏扩展。我复制粘贴了一些示例工作代码。
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;
}