枚举:他们可以用.h或者必须留在.cpp吗?

use*_*502 25 c++ header

如果我有类似的东西:

enum
{
    kCP_AboutBox_IconViewID = 1,
    kCP_AboutBox_AppNameViewID = 2,
    kCP_AboutBox_VersionViewID = 3,
    kCP_AboutBox_DescriptionViewID = 4,
    kCP_AboutBox_CopyrightViewID = 5
};
Run Code Online (Sandbox Code Playgroud)

在我的.cpp中可以进入.h吗?

更重要的是,除了类定义,变量等之外,还可以将其他更少的知识放入.h中

IAm*_*dge 41

.h文件本质上只是代码,在编译时,它被放在任何.cpp(或者.h文件)的上面.它因此你只需将.cpp文件中的任何代码放入.h文件中.它应该编译好.

然而,这是重要的设计.您的代码(例如您的枚举)应该放在.h文件中,如果您需要将它暴露给您包含.h文件的代码.但是,如果枚举仅特定于头文件.cpp实现中的代码,那么您应该将其封装在.cpp文件中.


mip*_*adi 8

是的,您的枚举定义可以放在您的头 ( .h) 文件中。但是,不要在.cpp文件中重复定义。

  • 如果它在头文件中而不是在命名空间块中,它将在全局命名空间中可用于包含头文件的每个编译单元。如果您想限制可访问性,可以在类中放置一个枚举并使其受保护或私有。 (2认同)

qua*_*ana 8

请记住在标题中使用标题包含警卫,例如:

#ifndef header_name_h
#define header_name_h
...
#endif
Run Code Online (Sandbox Code Playgroud)

这有助于您在多个标头包含标头时保持一个定义规则.

更新:

我发现最新版本的Visual Studio gcc都允许:

#pragma once
Run Code Online (Sandbox Code Playgroud)

此外,从未有过:

using namespace <name>;
Run Code Online (Sandbox Code Playgroud)

在标题中,这可能会导致奇怪的歧义问题.


小智 5

通常,枚举将用作类型定义,并且应始终位于头文件中。需要考虑的是它的范围。

如果枚举只是放在头文件中的任何范围之外,那么它对于包含头文件的任何事物都是全局可用的。如果您希望枚举只能由类本身访问,您可以将它放在类的私有部分。

通常,您不应将枚举设为全局范围,而应将其放在命名空间或类的公共部分中。然后您可以通过以下方式访问枚举

NamespaceOrClass::EnumValue
Run Code Online (Sandbox Code Playgroud)

此外,作为旁注,枚举会自动从您提供的第一个值(或 0)开始迭代值。

enum
{
    kCP_AboutBox_IconViewID = 1,
    kCP_AboutBox_AppNameViewID = 2,
    kCP_AboutBox_VersionViewID = 3,
    kCP_AboutBox_DescriptionViewID = 4,
    kCP_AboutBox_CopyrightViewID = 5
};
Run Code Online (Sandbox Code Playgroud)

完全一样

enum
{
    kCP_AboutBox_IconViewID = 1,
    kCP_AboutBox_AppNameViewID,
    kCP_AboutBox_VersionViewID,
    kCP_AboutBox_DescriptionViewID,
    kCP_AboutBox_CopyrightViewID
};
Run Code Online (Sandbox Code Playgroud)

这不是问题或错误,只是风格而已。