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

我有一个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 "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;
}