命名空间和定义之间的冲突

Bil*_*ias 6 c++ namespaces c-preprocessor

我有这个严重的问题.我在2个名称空间中有一个枚举,如下所示:

namespace FANLib {
namespace ERROR {

    enum TYPE {

        /// FSL error codes
        FSL_PARSER_FILE_IERROR,...
Run Code Online (Sandbox Code Playgroud)

在我的代码中的其他地方,我使用它像这样:

FANLib::Log::internalLog(FSLParser::FILE_IERROR, file_ierror, true, FANLib::ERROR::FSL_PARSER_FILE_IERROR);
Run Code Online (Sandbox Code Playgroud)

所有编译都很好,但如果我碰巧包含"windows.h",我会收到错误!问题出在"WinGDI.h"中,其中包含以下行:

#define ERROR               0
Run Code Online (Sandbox Code Playgroud)

并使编译器认为,在FANLib :: ...之后,有一个零!我得到的错误是:

错误1错误C2589:'常数':'::'右侧的非法令牌

错误2错误C2059:语法错误:'::'

错误3错误C2039:'FSL_PARSER_FILE_IERROR':不是'`global namespace''的成员

我可以做些什么,而不必因为一些不经意而改变我的命名空间#define?我在另一篇文章中读过我可以#undef ERROR,但这有多安全?

ava*_*kar 14

通常,您应该避免使用全大写标识符,因为它们用于宏.在这种情况下,我将重命名命名空间.

(作为旁注,<windows.h> #define其他类似的东西GetPrinter,实际上它很烦人.我通常会使用#undef它.它也有助于只包含<windows.h>.cpp文件,并确保受标题影响的范围尽可能小.)

  • Windows.h采用所有"标准接受的约定",将它们抛出窗口,并在它们周围声明宏.但是,好的建议.除了#define之外,不要使用全大写字母,并且不要在标题中显示windows.h. (4认同)
  • 我想添加"标准接受的约定"是所有大写的标识符都是宏. (2认同)