c++ - header 问题中的 C/C++ 命名空间

标签 c++ visual-c++

我正在尝试实现一个 Websocket 服务器。我正在使用 libwebsockets图书馆。

ConnectionServer.c 文件包含库和 main() 函数的设置代码(我看不出有什么重要的东西可以在这里发布。)该文件包含 1 个用于接收数据回调的文件,称为: dmserver_callback.cpp。 该文件然后包含另一个文件(我的自定义解析器文件),名为: data_parser.cpp。 然后该文件包含一个名为 definitions.h 的文件(问题的根源)。

请耐心等待;我知道包括文件(菊花链;可以这么说)可能不是最好的方法,我很可能应该使用头文件等。我的一个问题是,这是否特别必要?

澄清一下,在我尝试添加自己的解析机制之前,一切都按预期工作。

definitions.h文件如下:

namespace EngineDefinitions {
enum Version {
    Major = 1,
    Minor = 2
}; //Version;

namespace Server {
    enum enum_Server {
        MAX_PLAYERS = 200,
        MAX_TABLES = 42, // 3 tables per row.
        MAX_TABLE_PLAYERS = 10,
        GAME_PORT = 2040, //2042
        MAX_PARAMS = 10
    }; //Server;
};

namespace Login {
    enum enum_Login {
        USERNAME = 1,
        PASSWORD = 2
    }; //Login;
};
};

我的错误是:

definitions.h(1): error C2061: syntax error : identifier 'EngineDefinitions'

我在 Visual C++ 2010 Express 的新 Win32 控制台项目中加载了完全相同的 header ,它在那里工作。我看到的唯一区别是主文件(int main 函数所在的位置)。 在头文件工作的项目中称为: 连接服务器.cpp (C++)

并且不起作用的主项目文件被命名为: 连接服务器.c (C)

这是否与用 C 和 C++ 编译的文件有关?

我认为 libwebsocket 库是用 C 编写的。 我不记得我是否以完全相同的方式创建了项目文件。

附言如果我可以提供任何其他信息来提供帮助,请告诉我。

编辑:我也意识到你不应该在头文件中定义类型(例如:枚举)。 我确实尝试使用 extern enum 将源代码分成 .cpp 和一个头文件 没有区别。事实上,在尝试使用它们时遇到的错误(重新定义)比我预想的要多。

最佳答案

您需要了解 C++ 和 C 是不同的语言。当您将头文件包含在 .cpp 文件中时,编译器将尝试将 .h 编译为 C++ 代码。 C++支持命名空间,所以大家都很高兴。但是,当您尝试从 .c 文件中包含 .h 时(如果您遵循 #includes,这就是实际发生的情况),编译器会尝试将 .h 编译为 C 代码,但会失败,因为 C 中不存在 namespace .

解决这个问题的常用方法是使用预定义的宏。 __cplusplus 在编译为 C++ 代码时定义,而在编译为 C 代码时未定义(很明显)。

你可以这样做:

#ifdef __cplusplus
namespace EngineDefinitions {
#endif
enum Version {
    Major = 1,
    Minor = 2
}; //Version;

#ifdef __cplusplus
namespace Server {
#endif
    enum enum_Server {
        MAX_PLAYERS = 200,
        MAX_TABLES = 42, // 3 tables per row.
        MAX_TABLE_PLAYERS = 10,
        GAME_PORT = 2040, //2042
        MAX_PARAMS = 10
    }; //Server;
#ifdef __cplusplus
};
#endif

#ifdef __cplusplus
namespace Login {
#endif
    enum enum_Login {
        USERNAME = 1,
        PASSWORD = 2
    }; //Login;
#ifdef __cplusplus
};
#endif

当然,您无论如何都会失去 C 中命名空间的能力。

关于c++ - header 问题中的 C/C++ 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9578067/

相关文章:

android - 使用 C++ Builder Bridge 文件时出错

visual-c++ - 是否有一种干净的方法来处理 C++ COM 对象中抛出的 bad_alloc 异常?

c++ - 是否有可能阻止 RAII 样式类被实例化 "anonymously"?

c++ - 如果 _heapchk() 返回 "okay",我可以假设堆没有损坏吗?

C++ For 循环在过程中被跳过。如何修复它?

包含 ddd 调试器选项的 C++ Makefile

c++ - 我如何在 Red Hat 上强制使用 cxx11 ABI?

c++ - Qt::WA_DeleteOnClose

c++ - 如何暂停关闭按钮功能一段时间?

c++ - 如何将包含#pragma optimize( "a") 的代码从 VC++7 移植到 VC++9?