0

我想char array用 a初始化一个本地string,它生成为一个静态 const 指针。基本上它看起来像这样:

static const char * const FOO = "foo"; /* generated */
char bar[12] = FOO;                    /* my code */

编译器不接受它:

error: array must be initialized with a brace-enclosed initializer

我可以使用什么构造来初始化指向 by的char array栏?stringFOO

背景:在我的公司,我们使用 C++ 框架为 C 代码编写单元测试器。因此 bar 参数必须是数组,不能是 C++ 字符串类型。FOO 常量是从专有的 IDL 生成的。代码生成器为 C 代码生成 #define,但为 C++ 生成静态 const char * const。

4

4 回答 4

3

您不能使用指针初始化数组。但是您可以在默认初始化数组后复制字符串。

在我的公司,我们使用 C++ 框架为 C 代码编写单元测试器。因此 bar 参数必须是数组,不能是 C++ 字符串类型。

我不遵循你的推理。这似乎是一个错误的假设。

于 2020-01-30T12:12:48.793 回答
2

我希望以下内容会起作用:

static const char * const FOO = "foo"; /* generated */
char bar[12], *pBar = strcpy(bar, FOO);                    /* my code */

然后您可以通过bar[]或通过访问它pBar

有额外的冗余,char *但它可能并不重要。

您甚至可以考虑使用以下方法来防止缓冲区溢出:

static const char * const FOO = "foo"; /* generated */
char bar[12] = {0}, *pBar = strncpy(bar, FOO, sizeof(bar)/sizeof(bar[0]) - 1);                    /* my code */

您也可以考虑将其包装在 a#define中:

#define MAKEARRAY(name, size, thing) char name[size] = {0}, *p##name = strncpy(name, (thing), (size) - 1)

然后像这样使用它:

MAKEARRAY(bar2, 14, FOO);
于 2020-01-30T12:39:32.447 回答
0

这可行,但恕我直言,看起来很难看:

static const char *const X = "abc";
char x[12] = { X[0], X[1], X[2], X[3] };

定义会起作用:

#define X "abc"
char x[12] = X;
于 2020-01-30T12:27:03.570 回答
0

这并不理想,但应该给你一个想法。它使用局部变量,因此它们不会在这些函数之外持续存在。我不确定您使用的是您认为应该如何使用的静态。我建议不要把它放在函数中,因为你不能真正在函数之外访问它,但它会保留在内存中。

void ModifyString(char* data, int length)
{
    std::cout << "Data: " << data << ", Length: " << length;
}

void ModifyString(const char* data)
{
    char buffer[256];
    int length = -1;
    while (data[++length])
        buffer[length] = data[length];
    buffer[length] = 0;
    ModifyString(buffer, length);
}

int main() 
{
    ModifyString("Hello Test");
    return 0;
}
于 2020-01-30T12:44:14.557 回答