首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C++中,当我需要使用枚举时,如何避免#including头文件?

在C++中,为了避免使用#include头文件,可以使用enum class来定义枚举类型。enum class可以将枚举类型的作用域限制在其所在的命名空间或类中,从而避免命名冲突和不必要的全局枚举类型。

例如,在一个名为MyEnum的枚举类型中,可以使用enum class来定义:

代码语言:cpp
复制
enum class MyEnum {
    Value1,
    Value2,
    Value3
};

在这种情况下,可以直接在代码中使用MyEnum::Value1MyEnum::Value2MyEnum::Value3,而不需要使用#include头文件。

此外,使用enum class还可以避免枚举类型的隐式转换,提高代码的安全性和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【笔记】《C++Primer》—— 第19章:特殊工具与技术

同样的我们可以使用全局访问符来忽略掉我们自己定义类内的函数 和我们习惯的一样直接使用new和delete的时候是不需要头文件的,但是如果我们需要重载operator new/delete的话我们需要包含头文件...当我们重载这些函数,我们需要定义全局作用域或类作用域中,当我们将这些函数定义为类成员,它们将是隐式静态的,我们无需声明static。...,避免了名称冲突的问题 默认情况下枚举值从0开始,逐个加1,值不一定唯一 枚举成员是const的,因此我们初始化时必须用const,使用的时候也可以当作const使用 枚举类的成员初始化后就必须使用枚举类的成员才能赋值了...bitCount就是其包含的二进制位数 连续定义的位域会被编译器压缩在一个整数的相邻位,但是如何压缩是机器相关的 位域通常是使用位运算符来操作的 程序可能有一些变量并不由程序自身控制,例如与时钟相关的变量...Lang",其中Lang是目标语言的代号,例如C语言是C,当需要指示多个函数可以用大括号把函数都括在一起,这称为多重声明 多重声明可以包括头文件,而且链接指示可以嵌套,也就是此时头文件的所有函数都会被当作另一种语言写的

81740

【笔记】《C++Primer》—— 第四部分:高级主题(完)

try-catch 正则表达式的编译是非常慢的过程,所以应该避免创建不必要的表达式 标准库还定义了一系列用来替换过程控制匹配和格式的标志,但是使用的时候我们要在std命名空间中的regex_constants...type_info的引用,这个type_infotypeinfo头文件,我们可以在这个对象读取到目标e的类型 typeid也会决定表达式是否会被求值,只有类型含有虚函数才会对表达式进行求值 dynamic_cast...限定作用域的枚举定义需要加class/struct,即如enum class TypeName{mem1, mem2, mem3}; 限定作用域的枚举类的成员由于作用域枚举类的内部,所以必须通过访问符才能得到...,避免了名称冲突的问题 限定作用域的枚举成员默认类型是int,不限定作用域的枚举成员则没有默认类型,我们只能知道其类型足够容纳其初始值。...并不冲突 C++使用链接指示来指出那些非C++的函数 链接指示也就是函数的声明前写 extern "Lang",其中Lang是目标语言的代号,例如C语言是C,当需要指示多个函数可以用大括号把函数都括在一起

85810

值得一看:老外的嵌入式编程规范

for negative check */ 对于注释,总是使用/* comment */,即使是单行注释 头文件总是包含带有extern关键字的c++检查 每个函数都必须包含doxygen-enabled...所有枚举成员必须是大写的 结构/枚举必须遵循doxygen文档语法 声明结构体,它可以使用以下三种不同的选项之一: 1....c++检查 c++检查之外包含外部头文件 首先用STL C文件包含外部头文件,然后是应用程序自定义文件 头文件必须包含其他所有头文件,以便正确编译,但不能包含更多头文件(如果需要,.c应该包含其余的头文件...) 头文件必须只公开模块公共变量/类型/函数 头文件使用extern作为全局模块变量,稍后源文件定义它们 /* file.h ... */ #ifndef .......c文件应该首先包含相应的.h文件,然后是其他文件,除非另有明确的必要 头文件不包含模块私有声明 头文件示例(示例没有license) /* License comes here */ #ifndef

1.1K40

这才是理想的 C 语言编程规范

for negative check */ 对于注释,总是使用/* comment */,即使是单行注释 头文件总是包含带有extern关键字的c++检查 每个函数都必须包含doxygen-enabled...所有枚举成员必须是大写的 结构/枚举必须遵循doxygen文档语法 声明结构体,它可以使用以下三种不同的选项之一:   1....c++检查 c++检查之外包含外部头文件 首先用STL C文件包含外部头文件,然后是应用程序自定义文件 头文件必须包含其他所有头文件,以便正确编译,但不能包含更多头文件(如果需要,.c应该包含其余的头文件...) 头文件必须只公开模块公共变量/类型/函数 头文件使用extern作为全局模块变量,稍后源文件定义它们 /* file.h ... */ #ifndef .......c文件应该首先包含相应的.h文件,然后是其他文件,除非另有明确的必要 头文件不包含模块私有声明 头文件示例(示例没有license) /* License comes here */ #ifndef

2.2K20

老外的嵌入式编程规范(值得一看)

for negative check */ 对于注释,总是使用/* comment */,即使是单行注释 头文件总是包含带有extern关键字的c++检查 每个函数都必须包含doxygen-enabled...所有枚举成员必须是大写的 结构/枚举必须遵循doxygen文档语法 声明结构体,它可以使用以下三种不同的选项之一:   1....c++检查 c++检查之外包含外部头文件 首先用STL C文件包含外部头文件,然后是应用程序自定义文件 头文件必须包含其他所有头文件,以便正确编译,但不能包含更多头文件(如果需要,.c应该包含其余的头文件...) 头文件必须只公开模块公共变量/类型/函数 头文件使用extern作为全局模块变量,稍后源文件定义它们 /* file.h ... */ #ifndef .......c文件应该首先包含相应的.h文件,然后是其他文件,除非另有明确的必要 头文件不包含模块私有声明 头文件示例(示例没有license) /* License comes here */ #ifndef

1.6K20

C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 的命名空间分析 )

name , 如果 主程序 同时导入了这两个模块 , 就出现了冲突 ; 鉴于上述问题 , C++ 引入了新的概念 , 命名空间 namespace , 解决上述 标识符名称冲突的问题 ; 3、命名空间避免标识符冲突.../ 函数名称 等名称 , 出现 " 名称冲突 " 问题 ; 命名空间 , 开发者可以 将 各种 常量 / 变量 / 宏定义 / 函数 / 结构体 / 枚举 / 类 / 对象 等 内容 , 组织在一起...C++ 代码 , 就是定义了 全局空间变量 , 就是 默认命名空间 的变量 ; 调用 默认命名空间 的变量 , 可以使用 :: 前缀访问 ; 代码示例 : // 包含 C++ 头文件 #include...头文件 , 只有 60 行代码 , 核心的内容都定义 yvals_core.h 和 istream 头文件 ; 头文件 , 第 19 行使用了 _STD_BEGIN 宏定义 , 相当于定义...std 命名空间 C++ 代码 , 经常见到 下面两行代码 在一起使用 , 使用 C++ 的 iostream 标准流 , 需要使用 #include "iostream" 代码先导入该标准库

30130

总结c++ primer的notes

有一点要注意:如果您的编译器,long和int都是32位的,并且您需要使用32位整数,那么应该用long,而不要用int。...大多数语言中,对象的类型限制了对象可以执行的操作。如果某种类型不支持某种操作,那么这种类型的对象也就不能执行该操作。 C++ ,操作是否合法是在编译检查的。...(因为程序定义只能出现一次,如果含有定义头文件包含在多个源文件之中,就会出现重复定义) 一些 const 对象定义头文件 如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件定义...当我头文件定义了 const 变量后,每个包含该头文件的源文件都有了自己的 const 变量,其名称和值都一样。当该 const 变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。...避免多重包含 头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。

1.6K90

C++从入门到精通——命名空间

例如,C++标准库,所有的标准函数和类都被定义一个名为std的命名空间中,这样我们使用标准库需要通过std::前缀来访问其中的元素。 除了C++,其他编程语言也提供了类似命名空间的机制。...当我们在其他模块中导入某个模块,就可以通过该模块的名称来访问其中的元素,从而避免了命名冲突。 命名空间的使用不仅可以提高代码的可读性和可维护性,还可以帮助我们更好地组织和管理代码。...例如,当我代码写using namespace std;,我们就告诉编译器我们想使用标准库的所有名称,而不需要在每次调用标准库函数或类都加上std::前缀。...虽然引用命名空间和引用头文件C++编程中有着不同的作用,但它们实际应用往往是相辅相成的。例如,一个头文件,我们可能会定义一些属于特定命名空间的函数或类。...当其他源文件需要使用这些函数或类,它们不仅需要引用这个头文件,还需要引用相应的命名空间。这样,通过引用头文件和命名空间,我们就可以不同的源文件之间共享和重用代码,同时避免命名冲突和简化代码书写。

8610

小朋友学C++(1):Hello World!

在学C++之前,最好先学习一下C语言 让我们先运行一段简单的代码,编译器可以使用 在线C++编译器 或 Xcode(苹果系统) 或Dev C++(Windows系统)。...接下来我们讲解一下上面这段程序: (1)C++ 语言定义了一些头文件,这些头文件包含了程序必需的或有用的信息。上面这段程序,包含了头文件。...C++,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。...为了避免大规模程序的设计,以及程序员使用各种各样的C++,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域...(一)班内部说Teodoro,大家都知道说的是本班的Teodoro。也就是说,(一)班的Teodoro,其作用域是(一)班。 同理,(二)班的Teodoro,其作用域是(二)班。

55750

C++ 命名空间的 5 个常见用法

命名空间1995年被引入到 c++ 标准,通常是这样定义的: 命名空间定义了新的作用域。它们提供了一种避免名称冲突的方法。 c++ 的命名空间通常用于避免命名冲突。...1-避免名称冲突 如前所述,这是C++使用命名空间最常见的原因,在这种情况下,它们的使用只是对编译器有效。无法为开发人员代码可读性和维护性方面带来什么价值。...4-解决枚举类型成员重名问题 如果在同一个作用域内定义了具有相同名称的枚举C++的“传统”枚举会在其作用域内导出枚举值,可能会导致名称冲突, 一个大型项目中,不能保证两个不同的枚举都不会以同名命名...这个问题在C++ 11已经得以解决,它使用枚举类,隐式地对枚举名称枚举值进行定义。...5-隐藏实现 对于头文件实现的模板库,开发者调用时不需要用到特殊的数据类型,因为他们只专注于功能的实现,所以对于找到一种适合开发者调用库的方法是很有趣的。

21330

CC++编码规范

降低类间的耦合度 努力使类的接口少而完备 保持类的不同接口实现原则上的一致性 避免为每个类成员提供访问函数 不要在类定义提供成员函数体...>当遇到错误时对象应该应对有度 用嵌套类的方法减少匿名命名空间类的数量 2.4表达式和控制流程 让表达式直观 避免表达式中用赋值语句 不能将枚举类型进行运算后再赋给枚举变量...捕捉异常用引用 2.6头文件 使用条件宏防止头文件多次被引用 确保公共头文件的自足性 只引用需要头文件 引用头文件的顺序按照googleC...++标准, 参考:googleC++头文件包含顺序原则 引用时需要用绝对路径 将函数库放在一个单独的目录下引用 不要在头文件定义常量/变量 ...任何声明若被多个源文件引用则应在一个头文件 头文件尽量避免包含其他的头文件 2.7性能 使用性能追踪分析工具 不要用移位代替乘除运算 如无必要,不要用非int

1.9K20

C++复习笔记——0_零碎问题及解决笔记

如果我们一个头文件里声明了一个函数,当我需要定义这个函数(这个定义是唯一的,也就是只能定义一次),或者需要使用这个函数,我们 .cpp 需要 include 这个头文件。...同样地,如果我们一个头文件里声明了一个类,当我需要定义类里的成员函数,或者我们需要使用这个类,我们 .cpp 需要 include 这个头文件。...对于类的设计者来说,头文件就像他们和类的使用者的一个合同,编译器会强化这一合同,它会要求你使用这些类里的函数或结构必须要声明。 4. include 的以及" " 区别?...C++如何输入包含空格的字符串?...当在不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型数据),常用 typedef 声明一些数据类型,把它们单独放在一个头文件,然后需要用到它们的文件中用 #include 命令把它们包含进来

40430

EasyC++01,从C++示例程序说起

注释 首先是第一行,第一行表示的C++当中的注释。C语言当中的/**/的多行注释方法同样支持,但为了避免潜在的问题,尽量使用C++类型的注释。...有可能多个程序员同时开发了getValue函数,但当我们编译运行的时候,编译器无法知道我们究竟调用的是哪一个getValue,所以需要使用命名空间进行区分。...然而常用的许多函数、变量都明明std的命名空间当中,这就意味着当我使用这类内容的时候,都需要在前面加上std::,比如标准输出的cout命令,需要写成std::cout。...这会导致编码变得繁琐,所以C++提供了using namespace的功能,即告诉编译器当前使用的命名空间名称,这样我们调用该命名空间的内容,可以省略前缀。...除了使用endl之外,我们也可以使用换行符来达到同样的效果,如: cout << "hello" << "world\n"; C++ Primer当中建议输出由内容的字符串使用换行符,而非endl

30420

CMake基础

C++标准生成相应的机器指令码,输出到a.out这个文件,(称为可执行文件) ....建议使用静态库 但是他人提供的库,大多是作为动态库的,我们之后会讨论如何使用他人的库 windows静态库是以.lib 为后缀的文件,动态库是以.dll 为后缀的文件 linux静态库是以.a 为后缀的文件...,子目录也包含一个 CMakeLists.txt,其中定义的库 add_subdirectory 之后就可以在外面使用 子目录的 CMakeLists.txt 里路径名(比如 hello.cpp)都是相对路径...add_compile_options(-fopenmp) # 添加编译器命令行选项 注:没有target_前缀的选项会让项目所有文件都添加选项的属性 tips:add_definitions(NOMINMAX) 可以C...++定义变量为min/max不受到std的min/max影响 8.第三方库的引入 纯头文件引入: 有时候我们不满足于 C++ 标准库的功能,难免会用到一些第三方库。

1.9K20

为什么 #import 顺序对依赖管理很重要

Objective-C ,围绕 #import 顺序存在一些微妙的问题。你可能不相信我,直到你尝试新项目中重复使用旧代码。 狂野的 #import!...使导入最少化和完整化 导入时,头文件应满足这两个条件: 应尽量少 应尽量完整 "最少 "仅表示头文件导入的内容不应超过其需要。 "完整 "是指头文件导入编译所需的所有内容。...另一种头文件不完整的情况是 #import 顺序不当,掩盖了依赖关系。基于 C 的语言中,程序员开始编写实现文件,通常会在最大范围内包含最通用的头文件。...但是,如果在使用它的其他头文件之前展开它,这些头文件就会意外而非有意地使用它。如果在末尾导入,任何需要它但自己没有导入的头文件都会导致编译出错。这正是我想要的。...最重要的是,先包含你自己的头文件。约翰-拉科斯(John Lakos)所著的《大型 C++ 软件设计》是我所知道的唯一一本关于 "物理设计"——如何将源代码编排到文件的书。

7510

C++ 命名 Mangling 和 extern “C”

C++ 编译器在生成目标代码如何区分不同的函数——它通过添加有关参数的信息来更改名称。这种向函数名称添加附加信息的技术称为Name Mangling。...C++ 链接 C 代码,我们必须确保符号的名称不被更改。...从 C++ 链接如何处理 C 符号? C ,名称可能不会被修改,因为它不支持函数重载。那么当我 C++ 链接 C 代码如何确保符号的名称不被更改。...例如,请参阅以下使用 C 的 printf() 函数的 C++ 程序。 ...由于 C++ 支持函数重载,因此必须在函数名称添加附加信息(称为 Name mangling)以避免二进制代码的冲突。  2.  C 不能更改函数名称,因为它不支持函数重载。

1.1K40

使用元对象编译器

如果你是用qmake来生成你的Makefile文件,当需要的时候,编译规则需要包含调用元对象编译器,所以你不需要直接使用元对象编译器。...方法二用在你想让实现文件自包含,或者Q_OBJECT类是内部实现的并且头文件不可见的这些情况下使用。...对于头文件声明了Q_OBJECT宏的类,如果你只使用GNU的make的话,这是一个很有用的makefile规则: moc_%.cpp: %.h moc $< -o $...(当我们给我们的C++源文件命名为.cpp,元对象编译器并不留意,所以只要你喜欢,你可以使用.C、.cc、.CC、.cxx或者甚至.c++。)...绝大多数情况下,你忘记了编译或者#include元对象编译器产生的C++代码,或者(在前面的情况下)没有连接命令包含那个对象文件。

92640
领券