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

Lev*_*rts 2 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;
};
};
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 没有差别将源分成头文件.事实上,在尝试使用它们时,得到的错误(重新定义)比我讨价还价更多.

Mar*_*lon 6

您需要了解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中名称空间的能力.

  • 如果你这样做,你需要特别注意命名冲突.在将代码编译为C时,在根命名空间中放置类似"Version"或"Major"的内容可能不是一个好的计划. (2认同)

Joe*_*Joe 5

C 没有命名空间。真的。