我正在尝试实现一个 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/