Условная компиляция статических массивов const

Я пытаюсь создать перечисление ошибки и связанные текстовые дескрипторы, выровненные в одном файле. У меня есть файл 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 не понимает это правильно.

Есть идеи?

0

Решение

Обычно во всех проектах, над которыми я работал, я видел, как это делалось так.

Создать файл 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
}

Я не уверен, почему вы хотите, чтобы это было сделано в том же файле, но, как я уже сказал, именно так я обычно и вижу.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]