我正在尝试实现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控制台项目中加载了完全相同的标题,并且它可以正常工作。我看到的唯一区别是主文件(int main函数所在的位置)。
在头文件工作的项目中调用:
ConectionServer.cpp
(C ++)
并且不起作用的主项目文件命名为:
ConnectionServer.c
(C)
这是否与在C vs C ++中编译的文件有关?
我认为libwebsocket
库是用C编写的。
我不记得我是否以完全相同的方式创建了项目文件。
P.S。如果我能提供任何其他信息,请告知我们。
编辑:我也意识到你不应该在头文件中定义类型(例如:枚举)。
我尝试使用.cpp
将源分为extern enum
和头文件
没有区别。实际上,在尝试使用它们时,得到的错误(重新定义)比我讨价还价的要多。
答案 0 :(得分:6)
您需要了解C ++和C是不同的语言。当您将头文件包含在.cpp文件中时,编译器将尝试将.h编译为C ++代码。 C ++支持名称空间,所以每个人都很高兴。但是,当您尝试从.c文件中包含.h时(如果您按照#includes实际发生这种情况),编译器会尝试将.h编译为C代码,但由于C中不存在名称空间而失败
解决此问题的常用方法是使用预定义的宏。编译为C ++代码时定义了__cplusplus
,并且在编译为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中名称空间的能力。
答案 1 :(得分:4)
C没有名称空间。对于Real。
答案 2 :(得分:1)
您不能在C文件中包含C ++文件(除非它已准备好用于此类用途)。如果您然后尝试编译C文件,它将尝试将C ++文件编译为C.而是使用单独的编译和头文件。
请注意,C不了解名称空间。