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

C++ 作用域使用规范建议

使用匿名名字空间作用主要是将匿名名字空间中成员作用域限制源文件中,其作用域与使用static关键字类似,但是与static关键字不同是:包含在匿名名字空间中成员(变量或者函数)具有外部连接特性...(2)最好不要使用using指示符来引用名字空间 使用using指示符实际上就是取消了名字空间保护作用,增加了命名冲突概率。...(3)尽量不要使用全局函数 应该使用命名间中非成员函数和类静态成员函数。这样做原因是某些情况下,非成员函数和静态成员函数是非常有用,将非成员函数置于命名间中可避免对全尿作用域污染。...可在被嵌套类中前置声明嵌套类,.cpp文件中定义嵌套类,避免在被嵌套类中包含嵌套类定义,因为嵌套类定义通常只与实现相关。 缺点:只能在被嵌套类定义中才能前置声明嵌套类。...3.局部变量(Local Variable) (1)将局部变量尽可能置于最小作用域内,定义时将其显示初始化 C++允许函数任何位置声明和定义变量,我们提倡尽可能小作用域中定义变量,离第一次使用位置越近越好

1K20

Google C++ 编程风格指南(二):作用域

命名空间很容易令人迷惑,毕竟它们不再受其声明所在命名空间限制。内联命名空间只大型版本控制里有用。...头文件中使用匿名空间导致违背 C++ 唯一定义原则 (One Definition Rule (ODR)). 结论: 根据下文将要提到策略合理使用命名空间. 2.1.1....匿名名字空间 .cc 文件中, 允许甚至鼓励使用匿名名字空间, 以避免运行时命名冲突: namespace { // .cc 文件中 //...// 使用本名字空间内符号 EOF } // namespace 然而, 与特定类关联文件作用域声明该类中被声明为类型, 静态数据成员或静态成员函数, 而不是匿名名字空间成员....局部变量 将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化. C++ 允许函数任何位置声明变量. 我们提倡尽可能小作用域中声明变量, 离第一次使用越近越好.

73630
您找到你想要的搜索结果了吗?
是的
没有找到

Google C++编程风格指南(三)之作用域相关规范

使用匿名名字空间作用主要是将匿名名字空间中成员作用域限制源文件中,其作用域static关键字类似,但是其static关键字不同是:包含在匿名名字空间中成员(变量或者函数)具有外部连接特性,而用...(2)最好不要使用using指示符来引用名字空间 使用using指示符实际上就是取消了名字空间保护作用,增加了命名冲突概率。...(3)尽量不要使用全局函数 应该使用命名间中非成员函数和类静态成员函数。...这样做原因是某些情况下,非成员函数和静态成员函数是非常有用,将非成员函数置于命名间中可避免对全尿作用域污染。...可以考虑提取到新类中,或者将函数置亍独立库命名间中

1.2K30

C++名字空间详解

如果想在当前文件访问定义另一个文件中同名名字空间内成员变量,需要在当前文件名字空间内部进行申明。如标准C++库中所有组件都是一个被称为std名字空间中声明和定义。...(5)不能在名字空间定义中声明另一个嵌套命名空间,只能在命名间中定义子命名空间。 (6)名字空间成员,可以命名空间内部定义,也可以名字空间外部定义,但是要在名字空间进行声明。...4.1与static关键字共同作用 匿名名字空间提供了类似全局函数前加 static 修饰带来限制作用域功能。...如果将它们声明为全局静态变量(函数)就可以避免重定义错误。C++中,除了可以使用static关键字避免全局变量(函数重定义错误,还可以通过匿名名字空间方式实现。参考如下代码。...通过以上程序,可以看出匿名名字空间与static区别:包含在匿名名字空间中全局变量(函数)具有外部连接特性,而用static修饰全局变量具有内部连接特性,不能用来实例化模板非类型参数。

1.2K10

C++中变量声明与定义规则

静态全局变量(C++废弃,用匿名命名空间替代) Tips:对于全局变量,不管是否被static修饰,它存储区域都是静态存储区,生存期为整个源程序。...这种文件中进行静态声明做法是从C语言继承而来C语言中声明为static全局变量在其所在文件外不可见。这种做法已经被C++标准取消了,现在替代做法是使用匿名命名空间。...匿名命名空间:指关键字namespace后紧跟花括号括起来一系列声明语句,具有如下特点: 匿名命名空间内定义变量具有静态生命周期 匿名空间某个给定文件内可以不连续,但是不能跨越多个文件 每个文件定义自己匿名命名空间...,不同文件匿名命名间中定义名字对应不同实体 如果在一个头文件中定义了匿名命名空间,则该命名空间内定义名字每个包含该头文件文件中对应不同实体 namespace { int i; //...匿名命名空间内定义变量具有静态生命周期, 作用域仅限于当前文件 } 3.

2.2K10

@陈同学专属Python教程之函数

函数定义 你可以定义一个由自己想要功能函数,以下是简单规则: 例子 def hello(var) : 形参与实参 形参: 形式上参数,只是指代某事,出现在函数定义上 引用传递【可更改(mutable...这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。 # 加了星号 * 参数会以元组(tuple)形式导入,存放所有未命名变量参数。...#如果在函数调用时没有指定参数,它就是一个元组。我们也可以不向函数传递未命名变量。...#加了两个星号 ** 参数会以字典 #声明函数时,参数中星号 * 匿名函数 没有名字,函数调用时 无法使用名字,基本在哪里定义在哪里调用 python 使用 lambda 来创建匿名函数。...所谓匿名,意即不再使用 def 语句这样标准形式定义一个函数。 编程范式 #!

29620

【C++ 语言】命名空间 ( namespace | 命名空间定义 | 命名空间嵌套 | 域作用符 | 与 include 对比 )

::say_hi(); 4.访问命名间中方法 ( 已经声明情况下 ) : 如果已经声明命名空间 , 就可以直接调用命名间中方法 , 不需要使用 域作用符 访问命名间中方法 ; //声明命名空间...; 函数完全重复情况 : 如果出现两个函数 , 其 ① 函数名 ② 参数个数 ③ 参数顺序 ④ 返回值 完全重复 , 这样就会造成冲突 ; 命名空间作用 : 命名空间就是避免出现上述函数完全重复情况..., 可以将重复函数定义命名间中 , 这样就能区分两个完全相同函数 ; ---- 命名空间定义与使用完整代码 ---- 代码中包含部分 C/C++ 兼容 , C/C++ 字符串 相关代码 , 属于上一篇博客遗留...类型 变量 int a = 8; //② 定义 引用类型变量, 格式 : 类型名称& 变量名 = 对应类型变量名称 ; int& b = a; //③ 调用函数传入引用类型参数 : 将引用类型传给接收引用类型方法...完全相同情况 , 可以将重复函数定义命名间中 , 这样就能区分两个完全相同函数 return 0; }

1.3K30

C#.NET Web 部分复习总结(面试常问)

声明一个类时,只栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上内存空间。当使用 new 创建一个类实例时,分配堆上空间,并把堆上空间地址保存到栈上分配小片空间中。...总结一句话:c#值类型是为变量栈上分配了一块内存,用于存储数据,而引用类型分为两部分,声明时只栈上分配了一小部分内存,堆上没分配,而new引用变量时,是堆上分配了一块内存,存储是栈上内存地址...泛型最常见用途是创建集合类。 .NET Framework 类库 System.Collections.Generic 命名间中包含几个新泛型集合类。...匿名函数 匿名函数是一个“内联”语句或表达式,可在需要委托类型任何地方使用。 可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数。...处在同一个进程中所有线程都可以访问该进程所包含地址空间,当然也包含存储该空间中所有资源。 堆和栈区别? 栈:由编译器自动分配、释放。函数体中定义变量通常在栈上。

1.4K21

学习go语言编程之函数

如果函数返回值只有一个,不用声明返回值变量名: // 函数只有一个返回值,不用声明返回值变量名 func Add2(a, b int) int { // ... } 函数调用 调用函数前,需要导入函数所在包...返回值被命名之后,它们函数开始时候被自动初始化为函数中执行不带任何参数return语句时,会返回对应返回值变量值。...匿名函数 Golang中,函数可以像普通变量一样被传递或使用,可以随时代码里定义匿名函数。...匿名函数由一个不带函数函数声明函数体组成,如下所示: func(a, b int, z float64) bool { return a*b <int(z) } 匿名函数可以直接赋值给一个变量或者直接执行...Golang中闭包同样也会引用函数变量,闭包实现确保只要闭包还被使用,那么被闭包引用变量会一直存在。

14020

C++初阶-入门基础语法

引用使用 参数和返回值比较 引用和指针 七、内联函数 八、auto关键字 使用细则 九、基于范围for循环 范围for使用条件 十、指针值nullptr ---- 前言 ---- 本章主要讲解...普通命名空间 namespace N1 // N1为命名空间名称 { // 命名间中内容,既可以定义变量,也可以定义函数 int a; int Add(int left, int right...* right; } } 注:一个命名空间就定义了一个新作用域,命名间中所有内容都局限于该命名间中,避免因为同名变量以及函数而被调用(相当于一个壁障) 命名空间使用三种方式 示例1:加命名空间名称及作用域限定符...使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含头文件以及std标准命名空间 注意: C++函数都在std这个命名间中定义,而">”流输入输出则需要包含...迭代对象要实现++和==操作(现在只做了解) 十、指针值nullptr ---- C++98中指针声明一个变量时最好给该变量一个合适初始值,否则可能会出现不可预料错误 指针没有合法指向初始化

67020

【笔记】《深入理解C++11》(上)

, POD 库编程: 内联命名空间, 继承构造, 右值引用 C++11标准设计准则: 稳定性和兼容性之间抉择: auto, using, nullptr 用库而非扩展语言语法来实现特性: std::...能在任何命名间中使用, 因此最好写在外部作为提示并防止用到局部变量 noexcept 和 noexcept()指明某函数不能抛出异常(若抛出则直接terminate), 参数可以用bool值来决定是否允许抛出...右值引用形成拷贝/赋值函数称为移动拷贝/赋值, 核心是直接窃走目标对象内部指针指向内存内容, 然后置目标对象指针 无论声明了左值引用还是右值引用, 都必须在声明时立即初始化(参数列和初始化列表也算立即初始化..., 例如当存在非POD成员且这个成员有非平凡构造函数时, 这个union默认构造将被删除 匿名union对外是开放, 因此放在类声明中可以按照构造函数不同而初始化为不同类型, 此时类被称为枚举式类...各种匿名类型也都可以被重新命名并重用了 decltype只能以表达式作为参数, 所以需要获取某个函数返回类型时可以用虚假参数进行传入, 注意decltype是编译期进行, 因此不会真正运行这个函数

1.8K20

【C++】C++对C语言关系,拓展及命名空间使用

解决方法是将不同代码库放置不同命名间中。 思考:如果在项目中需要定义两个名为func函数,并且这两个函数都可以被其他文件访问,应该怎么办?...C++中所有名称,如符号常量、变量、宏、函数、结构、枚举、类以及对象等都是可以定义命名间中。 std命名空间是C++标准命名空间。...匿名命名空间是文件内部提供了一个独一无二命名空间,而内联命名空间则允许在外层命名空间直接访问内联命名间中成员,无需通过作用域解析运算符。...此外,我们还定义了一个匿名命名空间,并在其中定义了函数anonymousFunction()。由于匿名命名空间特性,该函数定义它文件内部可见,从而提供了一种限制访问范围方法。...使用using声明 你可以使用using声明来引入命名间中特定名称,从而在当前作用域中直接使用这个名称,而不需要每次都提供完整命名空间前缀。

11210

C++入门必备知识(你真的入门C++了吗?)

命名空间 1.命名空间产生原因 C/C++中,变量、函数和后面要学习类都是大量存在,这些变量、函数和类名称都存在于全局作用域中,可能会导致很多冲突。...注:同一个命名域中不能定义同名变量 //1.普通命 名空间 namespace N1 // N1为命名空间名称 //命名间中内容,既可以定义变量,也可以定义函数 int a; int Add...,编译器最后会合成同一个 命名间中。...namespace N1 { int Mu1(int left, int right) return left *right; } 注:一个命名空间就定义了一个新作用域,命名间中所有内容都局限于该命名间中...(关于迭代器这个问题,以后会讲,现在大家了解一下就可以了) C++98中指针良好C/C++编程习惯中,声明一个变量时最好给该变量-个合适初始值,否则可能会出现不可预料错误,比如末初始化指针

45120

From Java To Kotlin:安全、扩展、函数、Lambda很详细,这次终于懂了

引用(Null references):Java 中 null 值是经常导致程序运行出错原因之一,因为 Java 不支持安全。...--- 函数引用(Function reference) 普通变量有引用概念,我们可以将一个变量赋值给另一个变量,这一点,函数上也是同样适用函数也有引用,并且也可以赋值给变量。...可以看到 Java 里, 函数类型被声明为普通接口:一个函数类型变量是FunctionN接口一个实现。...--- 匿名函数不能单独声明 ()外面,因为匿名函数是(函数声明函数引用合二为一) 图片 // 具名函数不能直接赋值给变量,因为它不是对象 图片 // 函数()内不能直接 声明 具名函数,因为它不是对象...图片 这几个个报错是因为,匿名函数是把函数声明函数引用合二为一了,所以需要匿名函数地方,声明一个具名函数是报错,正确做法是改用具名函数引用 例如: higherOrderAdd(2,2

1.2K80

《C++Primer》第十八章 用于大型程序工具

1.2 模板特例化 模板特例化必须定义原始模板所属命名间中,和其他命名空间名字类似,只要我们命名间中声明了特例化,就能在命名空间外部定义它了: // 我们必须将模板特例化声明成std成员 namespace...未命名命名空间取代文件中静态声明标准C++引入命名空间概念之前,程序需要将名字声明成static以使其对于整个文件有效。文件中进行静态声明做法是从C语言继承而来。...通常情况下,头文件应该只负责定义接口部分名字,而不定义实现部分名字。因此头文件最多只能在它函数命名间中使用using指示或using声明。...相比于使用using指示,程序中对命名空间每个成员分别使用using声明效果更好,这样可以减少注入到命名间中名字数量。...合成析构函数体为

1.3K20

第 18 章 用于大型程序工具

命名空间,既可以定义全局作用域内,也可以定义在其他命名间中,但是不能定义函数和类内部。 命名空间作用域后面无需分号。...模板特例化必须定义原始模板所属命名间中命名间中声明了特例化后,就能在命名空间外部定义它了。...这一例外对于传递类引用或指针调用同样有效。对于下式,operator>>函数定义标准库 string中,string又定义命名空间 std中。...在这些命名间中所有与被调用函数同名函数都将被添加到候选集当中,即使其中某些函数调用语句处不可见也是如此。...派生类析构函数只负责清除派生类本身分配资源,派生类成员及基类都是自动销毁。合成析构函数体为

89020

Python升级之路(五) 函数

参数传递 传递可变对象引用 传递不可变对象引用 浅拷贝和深拷贝 传递不可变对象包含子对象是可变情况 三、常见函数 lambda表达式和匿名函数 eval()函数 递归函数 嵌套函数(内部函数)...了解其定义和底层原理以及变量作用域: 局部变量和全局变量 然后, 学习函数五种参数类型: 位置参数, 默认值参数, 命名参数, 可变参数, 强制命名参数 再然后, 学习几种常见函数: 匿名函数,...应尽量避免全局变量使用 要在函数内改变全局变量值,使用 global 声明一下 局部变量: 函数体中(包含形式参数)声明变量 局部变量引用比全局变量快,优先考虑使用 如果局部变量和全局变量同名...表达式可以用来声明匿名函数, 是一种简单同一行中定义函数方法 lambda 函数实际生成了一个函数对象 lambda 表达式基本语法如下: lambda arg1,arg2,arg3......,Python就会到全局 global 命名间中进行查找, 最后会在内建built-in 命名空间搜索 (如果一个名称在所有命名间中都没有找到,就会产生一个 NameError ) 【操作】测试LEGB

52510

第 18 章 用于大型程序工具

命名空间,既可以定义全局作用域内,也可以定义在其他命名间中,但是不能定义函数和类内部。 命名空间作用域后面无需分号。...模板特例化必须定义原始模板所属命名间中命名间中声明了特例化后,就能在命名空间外部定义它了。...这一例外对于传递类引用或指针调用同样有效。对于下式,operator>>函数定义标准库 string中,string又定义命名空间 std中。...在这些命名间中所有与被调用函数同名函数都将被添加到候选集当中,即使其中某些函数调用语句处不可见也是如此。...派生类析构函数只负责清除派生类本身分配资源,派生类成员及基类都是自动销毁。合成析构函数体为

97650

C++入门

例如: 这里myspace就是咱们自己定义命名空间,里面的rand就可以正常使用了 namespace myspace { // 命名间中可以定义变量/函数/类型 int rand = 10...,编译器最后会合成同一个命名间中。...N1 { int Mul(int left, int right) { return left * right; } } 注意: 一个命名空间就定义了一个新作用域,命名间中所有内容都局限于该命名间中...缺省参数 缺省参数概念 缺省参数是声明或定义函数时为函数参数指定一个缺省值。调用该函数时,如果没有指定实参则采用该形参缺省值,否则使用指定实参。...总之,之后C++代码中,我们就用nullptr表示指针值! 好了,今天分享到这里就结束了,感谢大家支持!

8110
领券