在C中,我如何确保初始化字符串的长度小于指定的

时间:2017-04-10 21:58:16

标签: c string initializer

我有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的{​​{1}}

或者,我可以将N+1的长度设置为bar_t.foo并在使用长度为N的字符串初始化时获取编译器警告但我现在需要使用期望的字符串显式当使用期望终结符的函数时,长度(即使用> N函数族,strn*()作为最大长度参数)。

有没有办法让编译器对初始化程序的长度进行限制,并且能够在不明确最大字符串长度的情况下处理字段?

1 个答案:

答案 0 :(得分:1)

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

上查看此操作