c++ extern的作用通俗来说的作用就是:可以在一个文件中引用另一个文件中定义的变量或者函数(1).先看引用同一个文件中的变量#include using namespace std
ES.12: Do not reuse names in nested scopes ES.12: 不要在嵌套作用域中重复使用同样的名称 Reason(原因) It is easy to get confused...这一个很大的if语句,很容易漏掉内部作用域引入了一个新变量d这个事实。这是有名的错误源之一。这种在内部作用域中重用名称的做法被称为“遮盖”。...例如,如果我们忘记using声明,调用d.f(1)时就无法发现f函数的整数版本。 ???...Enforcement(实施建议) Flag reuse of a name in nested local scopes 标记嵌套作用域中的名称重用。
一、类声明 //类是一种用户自定义类型,声明形式: class 类名称 { public: 公有成员(外部接口) private: ...五、类作用域、前向声明 (1)、每个类都定义了自己的作用域称为类作用域,类作用域中说明的标识符只在类中可见。... << "label2" << endl; goto LABEL1; LABEL3: cout << "label3" << endl; goto LABEL2; } (2)、C+...这时候需要用到前向声明,前向声明的类不能实例,但可以定义指针或引用。...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范
SF.7: Don't write using namespace at global scope in a header file SF.7:不要在头文件中的全局作用域中使用using namespace...标记在头文件的全局作用域中使用using namspace指令的情况。
.cpp 源码文件中 , 使用 #include "Student.h" 代码 , 包含头文件 , 使用 #include "Student.h" #include "Student.h" 代码 的作用...Debug Win32 ------ 1>Student.cpp 1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Student.h(15,1): error C2011...---- 在 .h 头文件中 , 只是对 变量 / 类 / 函数 , 进行声明 , 不实现它们 ; 导入 .h 头文件 的 作用是可以访问这些 变量 / 类 / 函数 的 声明 ; 在 实际 开发中...成员属性 和 成员函数 ; 不实现 成员函数 ; 成员函数 在 对应的 Student.cpp 中实现 ; 代码示例 : // 确保 该头文件 只包含一次 #pragma once /* // C...// 控制台暂停 system("pause"); return 0; } 执行结果 : 头文件代码 // 确保 该头文件 只包含一次 #pragma once /* // C
/arm/4.5.1/arm-none-eabi/include/c++/4.5.1:/usr/local/arm/4.5.1/arm-none-eabi/include/c++/4.5.1/arm-none-eabi...int, int*, int*, char**, char**)’: /root/built_qt/qte/src/corelib/tools/qlocale.cpp:6639: 错误:‘fenv_t’ 在此作用域中尚未声明...6639: 错误:expected `;' before ‘envp’ /root/built_qt/qte/src/corelib/tools/qlocale.cpp:6640: 错误:‘envp’ 在此作用域中尚未声明.../root/built_qt/qte/src/corelib/tools/qlocale.cpp:6640: 错误:‘feholdexcept’ 在此作用域中尚未声明 /root/built_qt/qte.../src/corelib/tools/qlocale.cpp:6655: 错误:‘fesetenv’ 在此作用域中尚未声明 目前解决方法:把/usr/include中的fenv.h 复制到qlocale.cpp
但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准协会(American National Standards Institute,ANSI)在此基础上制定了一个C语言标准,于1983...声明 因为C++是由C衍生出来的一种计算机语言,因此C++能够兼容C的99%的语法,目前咱们还为学习C++的输入和输出,因此这里通过C的语法来进行测试。...答案是有的,我们继续往下看; 3.6.3 通过关键字using和作用域限定符来展开指定作用域中的指定对象 在C++中通过using namespace将命名空间展开的方式称为完全展开,意思就是不管命名空间中存在什么内容...,如果未对变量所属的作用域进行声明,那么则无法正常使用该变量,如下所示: 这个是前面有提到过的内容,这里我就不再多赘述,我们直接说结论: 命名空间中对象的作用域就是该对象所在的命名空间,当我们将该命名空间展开后...,即可任意使用命名空间中的对象,未展开命名空间时,则需要在使用时对其进行声明; 4.3.3 命名空间中对象的生命周期 通过前面的复习,我们知道全局变量的生命周期是伴随整个工程的,而局部变量的生命周期是伴随对应作用域的
在作用域中查找名称时,会找到该名称的所有声明,有一个例外,被称为“struct hack”或“类型/非类型隐藏。...什么是 struct hack 同一作用域内的名称冲突:在C++中,如果在同一作用域内,一个名称被用作不同类型的声明,比如一部分声明是类型(如类、结构体、联合体或枚举),而另一部分声明是非类型(如变量、...查找会在多个作用域中进行,直到找到至少一个声明为止:文件作用域:在全局(顶层命名空间)中,查找会在名称使用之前的作用域中进行。...、块作用域中的函数声明(非using声明)或任何非函数或函数模板的声明,则不执行ADL。...参考引用 关于"在C++中确定一个名称"这一相关话题,本文仍有一些未提及的场景,比如模板参数推导、重载解析等,可以参考:
一、类作用域与名字查找规则:理解二义性的根源 1.1 类作用域的基本概念 在 C++ 中,每个类(包括基类和派生类)都有独立的作用域(Scope),类的成员(变量、函数、类型别名等)被封装在该作用域内。...0; } 错误信息 三、名字查找的底层规则:编译器如何判定二义性 3.1 依赖于 “无歧义的声明” 原则 C++ 标准规定:名字查找必须找到唯一的声明。...若在多重继承的多个基类作用域中找到同名的声明(无论这些声明是否等价),则视为二义性,编译器拒绝编译。...此时,派生类的作用域中存在该成员的唯一声明,名字查找会优先选择派生类的成员。...6.3 显式覆盖所有可能冲突的成员 在派生类中显式覆盖所有基类的同名成员(变量或函数),确保派生类作用域中存在唯一声明,从根本上避免二义性。
一、友元类简介 1、友元类引入 在 C++ 语言中 , " 友元类 " 是 一个类 与 另外一个类 的 特殊类关系累 , 在 类 A 的 " 友元类 " B 中 , 可以直接访问 A 类 的 私有成员...友元类主要作用 : 作为 某个类的 数据操作 辅助类 ; 作为 多个类 之间 传递信息 的 辅助类 ; 二、友元类和友元函数由来 1、友元类和友元函数引入 友元类 和 友元函数 会破坏 C++ 面向对象...有些编程场景 , 需要破坏类的封装性 , 需要访问类的私有属性 ; Java 中给出的方案是 反射机制 ; C++ 中给出的方案是 友元函数 和 友元类 ; 2、Java 反射机制 Java 类编译成...class 字节码后 , 可以通过 反射 字节码 的方式 访问 类的私有属性 ; 反射机制 在 特定领域开发 中应用广泛 , 如 SDK , 开发框架 , 逆向 等领域中 ; 反射机制 是 面向切面编程...AOP 的基础 ; 反射机制 成为一种编程标准 ; 3、C / C++ 编译过程 C 代码 和 C++ 代码 , 编译成 so 动态库 或 a 静态库 , 需要如下步骤 : 预编译 编译 汇编 链接
提前定义的,在整个作用域中可以在定义前调用(函数提升)。...函数作用域:定义在函数内部,只能在函数中访问。 块作用域(ES6引入):使用 let 或 const 声明的变量只在块内有效。...person.getName()); // 输出 "Kevin" person.setName("Feng"); console.log(person.getName()); // 输出 "Feng" 与 C+...+ 的对比 因为博主先学习的C++,所以对比语言,依照语言来学习语言。...特性 JavaScript C++ 参数类型 无需定义类型 需要显式定义类型 作用域 有块作用域(let 和 const) 主要是块作用域 闭包 通过词法作用域实现,常用 静态作用域中无原生闭包机制 函数提升
声明:本文学习需要C语言的基础,因为C++语法中与C重复的内容不会赘述。 1. C++的关键字(C++98) C++共有63个关键字,其中包含C语言的32种。...命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。...2.1 作用域 C/C++中的作用域指的是变量、函数或其他标识符在程序中的可见范围。正确理解作用域有助于避免命名冲突并管理数据访问。...; // 仅在 if 块内可见 } // y 在此不可访问 } 2.1.2 全局作用域(文件作用域) 定义:在函数外定义的变量或函数,从定义处到文件末尾可见。...函数重载 C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。...而与之相对应的是动态作用域dynamic scope则不同,其函数作用域中遇到既不是参数也不是函数内部定义的局部变量时,到函数调用时的上下文中去查。...,也就是声明时即规定作用域,而假如是动态作用域的话在此处会打印2。...现在大部分语言都采用静态作用域,比如C、C++、Java、PHP、Python等等,具有动态作用域的语言有Emacs Lisp、Common Lisp、Perl等。...[[Scopes]]: Scopes[1] 0: Global ... */ // 可以看见声明的s函数运行的上下文环境是全局作用域 函数作用域 当声明一个函数后,在函数内部声明的方法或者成员的运行环境就是此函数的函数作用域
C++起源 在1979年,本贾尼·斯特劳斯特卢普在贝尔实验室中进行复杂的软件开发时,他感受到了C语言的局限性,于是他在此基础上设计了C++。...C++在C语言的基础上添加了面向对象编程的特性:封装、继承、多态。 随后几年,C++不断完善发展,在1998年推出了C++98,官方第一个较为完善的版本,引入了STL(标准模板库)。...2.namespace的作用 在C/C++中,变量、函数、类是大量存在的,这些名称在全局域中可能会重复从而引发冲突。...3.域作用限定符 既然有不同的有不同的域,那我们可以通过域作用限定符(::)l来访问域中的成员变量。...函数重载 函数重载:同一作用域中出现同名函数,但是这些函数的形参各不相同。 函数重载允许返回值的类型相等,但是返回值的类型不同 不能作为函数重载的标识。
对于初学者或从其他语言(如 Java、C++)转过来的人,容易将 var 误认为是块级作用域,从而误判变量生存期和覆盖关系。...if块内部的x是一个独立的变量,生命周期仅限于该块的{}范围,不会覆盖外层函数作用域中的x。...JavaScript 在进入函数执行前,会进行一次静态扫描,登记所有使用 var 声明的变量名,并将这些变量的绑定建立在函数作用域中,但不会赋实际的运行值,默认值为 undefined。...因此类似以下代码: function demo() { // 由于 var 声明会在函数开始时被登记(提升), // 在此处访问 a 不会报错,但值为 undefined(尚未执行赋值语句)...相比之下,如果使用 let 或 const,在变量被声明之前访问会触发暂时性死区(Temporal Dead Zone),抛出 ReferenceError,从而显式暴露了未初始化访问的问题。
传统C++名称空间 我们先来复习一下几个术语。 声明区域 声明区域指的是可以在其中进行声明的区域,比如我们可以在函数外侧声明全局变量,对于全局变量,它的声明区域就是其声明所在的文件。...这是因为变量必须定义之后才能使用,所以潜在作用域的范围比声明区域要小。 这里有一个细节,变量并不一定在整个潜在作用域都是可见的。因为可能还会被嵌套在声明区域中的同名变量隐藏。...新的名称空间特性 C++新增了通过定义一种新的声明区域来创建命名的名称空间,这样做的目的是提供一个声明名称的区域。...比如C++ Primer当中的这个例子,下面使用新的关键字namespace创建了两个名称空间A和B。...::,使用名称空间名来找到该名称: A::pail = 12.34; A::fetch(); 没有作用域解析符的名称成为未限定名称,包含了名称空间的名称称为限定的名称。
写在前面 本篇文章件将帮助你了解C++函数重载的功能,及其原理。...//表达式1 1 + 3//调用了针对整型操作数的加法操作符 //表达式2 1.0 + 3.0//实际上调用了另一个专门针对浮点操作数的加法操作符 而对于函数来说,出现在相同作用域中的两个函数...形参名只是帮助文档,第二个函数形参表中依旧存在此参数类型,并没有修改形参表。...函数重载实现的本质——名字修饰(name Mangling) 首先,我们先了解一下C/C++是如何做到识别全局域中的函数的。在C/C++中,编译一个文件需要经历以下几个阶段:预处理、编译、汇编、链接。...而在链接阶段进行符号表合并与重定位时,C明显不具备处理同名函数的能力,在此处遇到函数名相同的函数便会直接报函数重命名的错误。 对于C++来说,符号表相较于C增加了名字修饰的功能。
1.情景引入 在C语言编写的代码中,存在着大量的变量、函数。而这些变量、函数又都存储于全局作用域中,这就引出了一个问题:如果变量名与函数名相同的情况下,会导致很多冲突。...前面提到C语言将所有的变量、函数都放在全局作用域中,从而造成冲突。...,于是C++将相关声明都放进了std命名空间中。...它们的定义是在C++标准库的预编译二进制文件中,std中的声明是为了方便后续的编译链接。 最后指出: std 命名空间的内容是随着包含的头文件动态增长的,且未包含的头文件中的声明不会进入 std。...三、函数重载 1.函数重载概念 函数重载: C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,用来处理实现功能类似数据类型不同的问题。
二、C++关键字 C++总计63个关键字,C语言32个关键字 三、命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。...包含头文件 stdlib.h后,会展开此文件,此在此头文件中有一个全局的函数,名为rand(),会与此处变量的命名造成冲突。还有一点:在不同的域中是可以定义同名变量的。...struct Named::Node phead; return 0; } 如果需要访问指定的域中的变量,现在变量前加上域名::变量名来访问(::– 域作用限定符),其中结构体较特殊,例:struct...注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。 C++中的四种域:全局域,局部域,命名空间域,类域。...流插入 return 0; } 注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间