C++ const静态数组的条件编译

C++ const静态数组的条件编译,c++,c,alignment,ifndef,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 *

我正在尝试创建一个错误枚举和在同一文件中对齐的关联文本描述符。我有一个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包含在所有需要错误服务的源代码中,它们不定义系统代码

我希望只有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\u msg(error)
。因此,在另一个文件中,您将拥有:

#include "myerror.h"
int method(){
    ERR whatever = OK;
    std::cout << err_msg(whatever);
    ... // Some other stuff here
}
#包括“myerror.h”
int方法(){
不管发生什么,都可以;

STD::这不是C,这是C++,因为枚举范围你尝试了一个不同的编译器吗?我问是因为我试图用GCC重现这个问题,但是不能这样做。但是,如果你可以编辑你的问题来包含A,它会很有帮助,因为没有这个,尝试复制这个问题是95%个猜测。我理解你的答案。我正试图将这两组信息放在同一个文件中,以防止两段代码不对齐。这是一个保护信息不出错的工程问题。有关使用不同编译器的注释没有帮助。是的,我相信使用条件al compile在gcc中可以工作。它应该与任何兼容的编译器一起工作。我尝试的解决方案中的任何替代方案都可以实现保持源代码一致(在任何编译器中)的目标,我们将不胜感激。