const静态数组的条件编译

时间:2018-12-01 18:02:45

标签: c++ c alignment ifndef

我正在尝试创建一个错误枚举以及在同一文件中对齐的关联文本描述符。我有一个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 :(得分:1)

通常,在我从事的所有项目中,我都看到它是这样做的。

创建文件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
}

我不确定为什么要在同一文件中完成它,但是正如我所说,这是我通常看到的完成情况。