我正在尝试实现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;
};
};
Run Code Online (Sandbox Code Playgroud)
我的错误是:
definitions.h(1): error C2061: syntax error : identifier 'EngineDefinitions'
Run Code Online (Sandbox Code Playgroud)
我在Visual C++ 2010 Express中的新Win32控制台项目中加载了完全相同的标题,并且它可以工作.我看到的唯一区别是主文件(int main函数所在的位置).在头文件工作的项目中调用:
ConectionServer.cpp(C++)
并且不起作用的主项目文件命名为:
ConnectionServer.c(C)
这是否与在C vs C++中编译的文件有关?
我认为libwebsocket库是用C编写的.我不记得我是否以完全相同的方式创建了项目文件.
PS如果有任何其他信息我可以提供帮助,请告诉我.
编辑:我也意识到你不应该在头文件中定义类型(例如:枚举).我DID尝试.cpp使用extern enum
没有差别将源分成头文件.事实上,在尝试使用它们时,得到的错误(重新定义)比我讨价还价更多.
您需要了解C++和C是不同的语言.当您将头文件包含在.cpp文件中时,编译器将尝试将.h编译为C++代码.C++支持名称空间,所以每个人都很高兴.但是,当您尝试从.c文件中包含.h时(如果您按照#includes实际发生这种情况),编译器会尝试将.h编译为C代码,但由于C中不存在名称空间而失败.
解决此问题的常用方法是使用预定义的宏.__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
Run Code Online (Sandbox Code Playgroud)
当然,你无论如何都会失去C中名称空间的能力.