Условная компиляция статических массивов const - PullRequest
0 голосов
/ 01 декабря 2018

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

Есть идеи?

1 Ответ

0 голосов
/ 01 декабря 2018

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

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

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

...