Я использую 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 в определение макроса, но ничего не смог с этим поделать
Причина сбоя этой линии:
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;
Также обратите внимание, что перед использованием их рекомендуется прочитать документацию о таких функциях 🙂
Других решений пока нет …