我在程序中使用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通知转换为宏定义,但实际上无法对此进行任何操作
答案 0 :(得分:2)
此行崩溃的原因:
strcat("basic program info", GPLINFO)
是因为它试图修改存储在只读内存中的常量字符串文字,这会产生 未定义的行为 。 strcat
的正确用法可能如此:
static char buf[1024];
strcpy(buf, "basic program info");
strcat(buf, GPLNOTICE);
但由于您使用c++编程,因此您应该更喜欢使用std::string
而不是C风格的字符串:
std::string doc("basic program info");
doc += GPLNOTICE;
另请注意,在使用它们之前,最好先阅读这些函数的文档:)