我有一个 struct
,其中一个成员是最大长度为 N
的字符串。定义:
typedef struct
{
const char foo[N];
} bar_t;
我希望这个结构的用户初始化长度不超过 foo
的 N
成员:
bar_t mybar = { .foo = "12345678" };
其中 N=8
。由于我无法控制 bar_t
的所有初始化,如果 bar_t.foo
的长度大于 N
,我想依靠编译器生成警告/错误。
问题是为了考虑终止符(为了能够将 bar_t.foo
用作普通字符串),我需要指定长度为 bar_t.foo
的 N+1
或者,我可以将 bar_t.foo
的长度设置为 N
,并在使用长度为 > N
的字符串初始化时获得编译器警告,但我现在需要明确预期的字符串长度(即使用 strn*()
函数族,其中 N
作为最大长度参数)在使用需要终止符的函数时。
有没有办法让编译器限制初始化器的长度,并且能够在不明确最大字符串长度的情况下处理该字段?
最佳答案
GCC 不会警告字符串初始化程序比分配的内存长,因为它是完全合法的。但是您可以使用类似于以下内容的宏和静态断言来提供编译时检查:
#include <stdio.h>
#define N 6
typedef struct
{
const char foo[N];
} bar_t;
#define INIT_FOO(var, initString) \
_Static_assert(sizeof(initString) < N, "Bad length!"); \
bar_t var = { .foo = initString };
INIT_FOO(mybar, "Good");
//INIT_FOO(mybar, "Baaaad");
int main(void) {
printf("%s\n", mybar.foo);
return 0;
}
在 ideone 上查看实际效果
关于c - 在 C 中,如何确保初始化字符串的长度小于指定的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333536/