Я пытаюсь создать перечисление ошибки и связанные текстовые дескрипторы, выровненные в одном файле. У меня есть файл system.cpp, который содержит следующее:
#define SYSTEMCODE
#include "myerrors.h"
Файл myerrors.h содержит:
typedef enum errors {
OK,
BADERROR,
LASTENUM } ERR;
#ifndef SYSTEMCODE
extern char const *_errtext[];
#else
const char * _errtext[ERR::LASTENUM +1] = {
"OK",
"BADERROR",
"LASTENUM" };
#undef SYSTEMCODE
#endif
Я включаю system.h во все источники, которым нужны службы ошибок, а они не определяют SYSTEMCODE.
Я ожидаю, что только файл system.cpp скомпилирует текстовый массив, а все остальные будут просто иметь внешнюю ссылку. Объект system.cpp не имеет массива _errtext, что вызывает ошибку связи. Я отключаю предварительно скомпилированные заголовки, и я попробовал много вариантов этого. MSDEV не понимает это правильно.
Есть идеи?
Обычно во всех проектах, над которыми я работал, я видел, как это делалось так.
Создать файл myerror.h
:
#ifndef _MYERROR_H__
#define _MYERROR_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef enum errors {
OK,
BADERROR,
LASTENUM
} ERR;
extern const char *err_msg(ERR err);
#ifdef __cplusplus
} // extern C
#endif
А потом файл myerror.cpp
:
#include "myerror.h"
static const char *_errtext[] = {
"OK",
"BADERROR",
"LASTENUM"};
const char* err_msg(ERR error){
return _errtext[error];
}
Таким образом, вы просто должны включить myerror.h
из всех файлов, которые вы хотите и позвоните err_msg(error)
всякий раз, когда вы хотите напечатать ошибку в текстовом формате. Итак, в другом файле у вас будет:
#include "myerror.h"int method(){
ERR whatever = OK;
std::cout << err_msg(whatever);
... // Some other stuff here
}
Я не уверен, почему вы хотите, чтобы это было сделано в том же файле, но, как я уже сказал, именно так я обычно и вижу.
Других решений пока нет …