Доброго всем времени суток. Сразу прошу прощения за "ламерский" вопрос — с сишником работаю недавно. При работе с чужими исходниками наткнулся на следующий кусок кода:
...
const char SHORT_VERSION_STRING[256]="2.1.1";
const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
...
/*____________________________________________________________________________
Return a C string of the form:
"Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/
ErrCode
GetVersionString( char theString[ 256 ] )
{
static const char kVersionString[] =
"Version " SHORT_VERSION_STRING " " COPYRIGHT_STRING;
...
}
Из этого я понял, что в kVersionString должно хранится объединение строк "Version ", SHORT_VERSION_STRING, " " и COPYRIGHT_STRING. Однако, при компилляции на MS VC++ 2005 компиллятор на данную конструкцию заругался следующим образом:
syntax error : missing ';' before identifier 'SHORT_VERSION_STRING'
syntax error : missing ';' before 'string'
syntax error : missing ';' before identifier 'COPYRIGHT_STRING'
Я попытался отредактировать исходник следующим образом:
...
const char SHORT_VERSION_STRING[256]="2.1.1";
const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
...
/*____________________________________________________________________________
Return a C string of the form:
"Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/
ErrCode
GetVersionString( char theString[ 256 ] )
{
static const char kVersionString[] =
strcat(strcat(strcat("Version ", SHORT_VERSION_STRING), " "), COPYRIGHT_STRING);
...
}
На этот раз компиллятор выдал такую ошибку: error C2099: initializer is not a constant.
Тогда я убрал из объявления kVersionString спецификатор static, чтобы kVersionString объявлялась как автоматическая переменная (на MSDN написано, что ошибка initializer is not a constant возникает только при работе с неавтоматическими переменными). На сей раз при компилляции возникла ошибка: error C2075: 'kVersionString' : array initialization needs curly braces. Насколько я понимаю, фигурные скобки требуются при инициализации массива только если массив инициализируется заданием значения каждого его элемента. Из чего я сделал вывод, что я вообще пошёл не тем путём.
Как можно решить эту задачу (объединение нескольких строк и сохранение результата объединения в другой строке)? При этом желательно как можно меньше менять исходник (в частности объявления переменных), т.к. любое такое изменение может повлечь какие-либо нежелательные последствия.
Заранее благодарен.
Здравствуйте, Lord Carlsberg, Вы писали:
...
#define SHORT_VERSION_STRING "2.1.1"
#define COPYRIGHT_STRING "(C) Copyright bla-bla-bla"
...
/*____________________________________________________________________________
Return a C string of the form:
"Version 2.0 (C) Copyright bla-bla-bla"
____________________________________________________________________________*/
ErrCode
GetVersionString( char theString[ 256 ] )
{
static const char kVersionString[] =
"Version " SHORT_VERSION_STRING " " COPYRIGHT_STRING;
...
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, Lord Carlsberg, Вы писали:
LC>Я попытался отредактировать исходник следующим образом:
LC>LC>...
LC>const char SHORT_VERSION_STRING[256]="2.1.1";
LC>const char COPYRIGHT_STRING[256]="(C) Copyright bla-bla-bla";
LC>...
LC>/*____________________________________________________________________________
LC> Return a C string of the form:
LC> "Version 2.0 (C) Copyright bla-bla-bla"
LC>____________________________________________________________________________*/
LC>ErrCode
LC>GetVersionString( char theString[ 256 ] )
LC>{
LC> static const char kVersionString[] =
LC> strcat(strcat(strcat("Version ", SHORT_VERSION_STRING), " "), COPYRIGHT_STRING);
LC>...
LC>}
LC>
LC>На этот раз компиллятор выдал такую ошибку: error C2099: initializer is not a constant.
LC>Тогда я убрал из объявления kVersionString спецификатор static, чтобы kVersionString объявлялась как автоматическая переменная (на MSDN написано, что ошибка initializer is not a constant возникает только при работе с неавтоматическими переменными). На сей раз при компилляции возникла ошибка: error C2075: 'kVersionString' : array initialization needs curly braces. Насколько я понимаю, фигурные скобки требуются при инициализации массива только если массив инициализируется заданием значения каждого его элемента. Из чего я сделал вывод, что я вообще пошёл не тем путём.
Проблема в том, что так массивы инициализировать можно только константами времени компиляции, т.е
char kVersionString[] = "(C) Copyright bla-bla-bla"; // так можно
char kVersionString2[] = getSomeString (); // а так нет, т.к. в момент компиляции неизвестно, что веренет
// getSomeString ()
LC>Как можно решить эту задачу (объединение нескольких строк и сохранение результата объединения в другой строке)? При этом желательно как можно LC>меньше менять исходник (в частности объявления переменных), т.к. любое такое изменение может повлечь какие-либо нежелательные последствия.
Master Yoda уже привел хорошее решение.
Возможные проблемы могут быть только, если длина полной строки версии вместе с завершающим нулем превысит 256 символов.
Но чтобы учесть этот случай без переписывания этого кода не обойтись.
static const char szSHORT_VERSION_STRING [256] = "2.1.1";
static const char szCOPYRIGHT_STRING [256] = "(C) Copyright bla-bla-bla";
char szVersion [256];
sprintf (szVersion, "Version %s %s", szSHORT_VERSION_STRING, szCOPYRIGHT_STRING);
Да и забыл....
[256] писать не надо под уже статически выделенные строки "", только под суммарную строку...
Здравствуйте, Shmakov, Вы писали:
static const char szSHORT_VERSION_STRING [] = "2.1.1";
static const char szCOPYRIGHT_STRING [] = "(C) Copyright bla-bla-bla";
char szVersion [256];
sprintf (szVersion, "Version %s %s", szSHORT_VERSION_STRING, szCOPYRIGHT_STRING);