Если у вас есть:
// structs.hpp
#define LC_ERR_LEN 300
typedef struct dLC_ERRMSG {
short nr;
short strategy;
char tx[LC_ERR_LEN];
} LC_ERRMSG;
и
// main.cpp
#include "structs.hpp"
LC_ERRMSG err;
int main()
{
// ...
char *szError;
szError = strerror(sStatus);
snprintf(err.tx, LC_ERR_LEN, "%s - %s", szFilename, szError);
}
тогда это должно работать. Однако, если вы переключите вторую строку main.cpp
на:
extern LC_ERRMSG err;
тогда вам нужно убедиться, что хранилище для err
скомпилировано в один из ваших объектных файлов. Например, вы можете скомпилировать этот источник:
// globals.cpp
#include "structs.hpp"
LC_ERRMSG err;
и связать полученный globals.o
в main.o
.
Любой из подходов не должен вызывать ошибки сегментации. Если вы получаете ошибку сегментации, проблема может быть в том, что LC_ERR_LEN
имеет другое значение при компиляции globals.cpp
, чем при компиляции main.cpp
. Или, возможно, szFilename
или szError
NULL
/ плохо. Семейство printf
не может печатать NULL
или плохие указатели с флагом формата %s
; следующий код вызывает ошибку сегментации:
#include <stdio.h>
int main()
{
printf("%s\n", NULL);
}
РЕДАКТИРОВАТЬ: Я подумал о другой потенциальной причине проблемы. Вы можете столкнуться с символом, если используете компилятор C, так как err
- это символ, который может использоваться как имя нескольких различных глобальных переменных в большом проекте. Если вы используете компилятор C ++, тогда процесс искажения имени должен гарантировать, что каждый err
имеет свой собственный символ. Просто убедитесь, что вы компилируете как C ++.