visual C/C++命名空间在标头问题中

visual C/C++ namespace in header issue

本文关键字:问题 命名空间 C++ visual      更新时间:2023-10-16

我正在尝试实现一个Websocket服务器。我正在使用libwebsockets库。

ConnectionServer.c文件有库和main()函数的设置代码(我看不出有什么重要的东西可以在这里发布。)这个文件包括一个用于接收数据回调的文件,名为:CCD_ 2。然后,这个文件包括另一个文件(我的自定义解析器文件),名为: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学习版的一个新的Win32控制台项目中加载了完全相同的头,它就在那里工作了。我看到的唯一区别是主文件(int main函数所在的位置)。在头文件工作的项目中,称为:ConectionServer.cpp(C++)

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

这与用C和C++编译的文件有关吗?

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

附言:如果我能提供任何其他信息来帮助你,请告诉我。

编辑:我还意识到你不应该在头文件(例如:enums)中定义类型。我确实尝试使用extern enum将源文件分离为.cpp和头文件没有区别。事实上,在尝试使用它们时,我遇到了比我预想的更多的错误(重新定义)。

您需要了解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

当然,无论如何,您都会失去C中名称空间的功能。

C没有名称空间。来真的

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

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