2012-03-06 18 views
2

我试图实现一个WebSocket服务器。我正在使用libwebsockets库。标题问题中的C/C++名称空间

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' 

我装在一个新的Win32控制台项目完全相同的头在Visual C++ 2010 Express和有它的工作原理。我看到的唯一区别是主文件(int main函数驻留)。 在该头文件中的作品被称为项目: ConectionServer.cpp(C++)

和不工作被命名为主要的项目文件: ConnectionServer.c(C)

这是否有东西做该文件正在编译C或C++?

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

P.S.请让我知道是否有任何其他信息可以提供帮助。

编辑:我也意识到你不应该定义头文件内的类型(例如:枚举)。 我尝试使用extern enum 将源文件分成.cpp和头文件,没有区别。事实上,当我尝试使用它们时,出现了比我讨价还价更多的错误(重新定义)。

+0

你真的不应该包含'.cpp'文件。 – Marlon 2012-03-06 04:52:43

+0

是的,我明白我不应该以这种方式包含文件。正如我所提到的,即使我使用适当的头文件,我仍然在第一个项目中得到这个错误,但不是第二个。 – 2012-03-06 04:57:01

+1

您需要了解C++和C是不同的语言。将头文件包含在'.cpp'文件中时,编译器会尝试将'.h'编译为C++代码。 C++支持命名空间,所以每个人都很开心。但是当你尝试从'.c'文件中包含'.h'(这是实际发生的事情,如果你遵循'#include's),编译器试图将'.h'编译为C代码,但因C中不存在名称空间而失败。没有人开心。 – Marlon 2012-03-06 04:59:16

回答

5

您需要了解C++和C是不同的语言。将头文件包含在.cpp文件中时,编译器将尝试将.h编译为C++代码。 C++支持命名空间,所以每个人都很开心。但是当你试图包含.h的时候。c文件(这是实际发生的事情,如果您遵循#include),编译器会尝试将.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 

,当然还有,你失去的命名空间的能力,用C反正。

+2

如果你这样做,你需要额外的超级小心处理命名冲突。在编译代码时,在根名称空间中放入类似'Version'或'Major'的东西可能不是一个好计划。 – 2012-03-06 05:06:05

+0

这是迄今为止最好的答案,所以我将其标记为如此。我的问题的最佳解决方案是将项目转换为C++。另外,作为说明,我明白他们是不同的语言,但无法知道项目设置为什么,因为这两个项目都是用Visual C++打开的。我假设这是我的问题 - 对不起,如果我没有这样做明显。 – 2012-03-06 05:15:19

+0

更新:我刚完成将项目更新到C++,现在一切都按照预期工作。你几乎发现它在做什么。当命名空间需要C++时,编译器试图将程序编译为C.感谢帮助。 – 2012-03-06 05:39:13

4

C没有名称空间。真的。

1

您不能在C文件中包含C++文件(除非它已准备好用于此类用途)。如果您尝试编译C文件,它会尝试将C++文件编译为C,而不是使用单独的编译和头文件。

请注意,C不理解命名空间。

+0

@Levi:听起来好像是时候拿起[一本关于C++编程的好书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – 2012-03-06 05:03:12