如何获得字符串的大小以与预处理器进行比较

时间:2016-06-16 07:32:47

标签: c c-preprocessor

我正在尝试将cpp的错误添加到我的源代码中,以通知谁正在将字符串大小更改为太小而无法处理数据。

假设您有某种喜欢

#define STRING "Hello world"

我希望在代码的后续部分中有类似

的内容
#if STRING_LENGTH < MAX_STRING_LENGTH
#error "you need to extend the value of MAX_STRING_LENGTH"
#endif

所以问题是:如何定义STRING_LENGTH

2 个答案:

答案 0 :(得分:3)

您无法在预处理器中执行此操作。您可以做的最好的事情是使编译时间保持不变。

sizeof("string literal") - 1strlen("string literal")

相同

然后,您可以使用C11中的_Static_assert进行编译时检查:

_Static_assert(sizeof(STRING) - 1 < MAX_STRING_LENGTH, "you need to extend the value of MAX_STRING_LENGTH")

答案 1 :(得分:0)

C预处理器不提供任何获取字符串文字长度的机制。

但是,对于C99或C11模式下的gcc / clang,并使用-Wall选项,您可以通过插入以下内容强制编译器警告:

static void validateSTRING(void) {
  (void)(char[MAX_STRING_LENGTH]){STRING};
}

(注意:使用MAX_STRING_LENGTH是故意的。如果你实际上正在分配一个数组,你会希望MAX_STRING_LENGTH+1为NUL终结符留出空间,但这里只是试图产生一个如果您故意不为NUL留出空间,警告和编译器不会发出警告。)