标题问题中的C / C ++命名空间

时间:2012-03-06 04:48:42

标签: 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控制台项目中加载了完全相同的标题,并且它可以正常工作。我看到的唯一区别是主文件(int main函数所在的位置)。 在头文件工作的项目中调用: ConectionServer.cpp(C ++)

并且不起作用的主项目文件命名为: ConnectionServer.c(C)

这是否与在C vs C ++中编译的文件有关?

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

P.S。如果我能提供任何其他信息,请告知我们。

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

3 个答案:

答案 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不了解名称空间。