如何使用条件#error

时间:2015-11-02 05:33:03

标签: c error-handling compiler-errors pragma build-error

我在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指令"尺寸大于最大尺寸"

我做错了什么?

3 个答案:

答案 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的结构来强制执行检查。