-2

我在程序中使用 argp,它使用全局定义的 char doc[] 来显示有关程序的信息。

除了程序信息,我想在这个文档中添加一个 GPL 通知。

GPL 声明被定义为 const char * (但我不介意更改它),因为它在其他一些地方使用。

最初我试过这个:

static char doc[] = strcat("basic program info", GPLNOTICE);

但这给出了:

error: initializer fails to determine size of ‘doc’

然后我尝试转换为字符串:

static char doc[] = (string("basic program info") + string(GPLNOTICE)).c_str()

但这给出了同样的错误

然后我想也许让 doc 一个 char * 也可以

static char *doc = strcat("basic program info", GPLINFO)

...但这会因分段错误而崩溃

我尝试将 GPL 通知转换为宏定义,但实际上对此无能为力

4

1 回答 1

2

此行崩溃的原因:

strcat("basic program info", GPLINFO)

是因为它试图修改存储在只读内存中的常量字符串文字,这会产生未定义的行为。的正确用法strcat可能如下所示:

static char buf[1024];
strcpy(buf, "basic program info");
strcat(buf, GPLNOTICE);

但是由于您使用进行编程,因此您应该更喜欢使用std::string而不是 C 风格的字符串:

std::string doc("basic program info");
doc += GPLNOTICE;

另请注意,在使用它们之前阅读这些函数的文档是一种很好的做法:)

于 2013-03-30T08:04:38.240 回答