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

还有没有理由对常量使用extern呢?

常量是指在程序运行过程中不会发生变化的值。在C语言中,我们可以使用关键字const来定义常量。常量的值在编译时确定,并且在程序的整个生命周期中保持不变。

在C语言中,使用extern关键字可以声明一个变量或者函数是在其他文件中定义的。这样做的目的是为了在当前文件中使用这个变量或者函数,而不需要重新定义它。通常情况下,extern关键字用于声明全局变量或者函数。

然而,对于常量来说,使用extern关键字是没有必要的。因为常量的值在编译时就已经确定了,不会发生变化。在C语言中,常量的定义通常是放在头文件中,然后在需要使用的文件中包含这个头文件即可。这样做的好处是可以提高代码的可读性和可维护性。

总结起来,对常量使用extern是没有必要的,因为常量的值在编译时就已经确定了,不会发生变化。我们可以直接在需要使用的文件中包含常量的定义即可。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云产品介绍:https://cloud.tencent.com/product
  • 腾讯云云原生产品:https://cloud.tencent.com/solution/cloud-native
  • 腾讯云数据库产品:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器产品:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网产品:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发产品:https://cloud.tencent.com/product/mobile
  • 腾讯云存储产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链产品:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙产品:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OC代码规范1——多用类型常量,少用#define预处理指令

不是说好使用const修饰以后就不可以更改了吗?那么这里的str为什么可以更改?...总结 1,在定义常量的时候,使用extern const或者是static const要优于使用#define预处理指令。...2,不要使用#define预处理指令来定义常量理由如下:(1)这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找和替换操作;(2)即使有人重新定义了常量值,编译器也不会产生警告⚠️信息,...我们应该使用extern const或者是static const来声明并定义常量,借助编译器确保常量值不变。...由于此类常量会出现在全局符号表中,所以常量的名称需要以与之相关的类名做前缀。 5,使用extern const来声明的全局常量,必须并且只能初始化一次,如果其多次初始化,那么编译器会报错。

1.5K30

Objective-C 中 9 种避免使用 Xcode 预处理器宏的方法

但我想几乎所有其他内容提出质疑!这有什么关系?因为每次使用预处理器时,你看到的并不是你编译的内容。对于作为常量使用的 #define 宏,我们需要避免一些陷阱——其实我们完全可以避免这些陷阱。...Xcode 预处理器宏,以及如何替换它们: 1、#include 让我们从传统 C 中的一个简单例子开始: Smell #include "foo.h" 除非您提供的是平台无关的 C 或 C++ 代码,否则没有理由使用...(当然,你要遵循苹果公司的编码指南,在名称上使用前缀,吗?)...怎么办?当时的答案是使用预处理器:用 #if 0 封装代码就可以了。 但那是很久以前的事了,那时还没有现代集成开发环境和彩色编码方式。...但还有一个问题,我们将在下一节中讨论:如果注释掉的代码是临时性的,并且您计划很快将其清理干净,那么注释掉代码是没有问题的。

11310
  • iOS学习——iOS 宏(define)与常量(const)的正确使用

    那么这两个关键字的具体用法和作用是什么?下面我们就一起探究一下。 关键字extern 关键字extern主要是用来引用全局变量,它的原理是先在本文件中查找,查找不到再到其他文件中查找。...我们一般的用法是在.h文件中用extern申明一个常量名称,表示该常量可以让外部引用,然后在.m文件中常量进行初始化。...2、static修饰全局变量 当全局变量没有使用static修饰时其存储在静态存储区,直到程序结束才销毁。也就是其作用域是整个源程序。我们可以使用extern关键字来引用这个全局变量。...当全局变量使用static修饰时,其生命周期没有变,依旧是在程序结束时才销毁。但是其作用域变了。现在只限于申明它的这个文件才可见。使用extern关键字无法引用这个全局变量。...即如果在.m文件中用static定义了常量,那么就不能在.h文件中使用extern进行外部申明。

    1.8K30

    C++的extern关键字知识点

    宝剑有双锋,extern的应用,不同的场合应该选择不同的做法。...4 问题:extern “C”   在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况?   ...具体差别首先,static与extern是一“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;其次,static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static...7. extern 和const    C++中const修饰的全局常量据有跟static相同的特性,即它们只能作用于本编译模块中,但是const可以与extern连用来声明该常量可以作用于其他编译模块中...修饰的是char *而不是g_str,它的g_str并不是常量,它被看做是一个定义了的全局变量(可以被其他编译单元使用), 所以如果你像让char*g_str遵守const的全局常量的规则,最好这么定义

    1K40

    常量与变量

    所以在这里我们只能用#define标识符来进行常量的修饰 当然用const关键字修饰的话知识一种常量的修饰方式,实际上还有另外一种的修饰能够定义常量那就是用 #define 预处理编译器也是可以定义常量方式的一种方式...除了上面所讲述的还有一种常量被称之为:枚举常量 — 可以①①列举的常量 如下示例 #include enum color { //枚举常量 black, white, gules...另一种是不需要建立存储空间的,通过使用 extern 关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。...extern int number;// 声明,没有定义! int number;           // 声明,定义了!...如果这个程序没有extern关键字的话,程序就会报错,因为它们找不到变亮的值 在这段代码中运用到了一个全局变量的知识,在这里跟大家说下: 在所有的函数外部定以的变量叫做:全局变量。

    70320

    extern关键字

    变量的声明指向程序表名变量的类型和名字,即使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含那个名字的声明。...但C++中由于extern的缘故,变量的声明和定义是可以分开的。凡是没有extern的声明同时也都是定义。而对函数而言,带有{}是定义,否则是声明。...这里强调全局且非常量的原因是,全局非常量的变量默认是外部链接的。...C和C++函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。  ...一些问题 使用extern和包含头文件来引用函数有什么区别?  与include相比,extern引用另一个文件的范围小,include可以引用另一个文件的全部内容。

    2.4K30

    【CC++】extern 的一些注意事项

    这就说明了数组变量是一个地址,而且,还是一个不可修改的常量,具体来说,就是一个地址常量。 数组变量跟枚举常量一样,都属于符号常量。数组变量这个符号,就代表了那块内存的首地址。...a,其地址可能是 0x87654321,因此直接使用 extern char *a 是错误的。...与 extern 对应的关键字是 static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被 extern "C" 修饰。...extern "C" int foo(int x, int y); #endif 在模块 B 的实现文件中仍然调用 foo(2, 3),其结果是: 模块 A 编译生成 foo 的目标代码时,没有其名字进行特殊处理...后记 以上就是 【C/C++】extern 的一些注意事项 的全部内容了,希望大家有所帮助!

    34310

    c++基础之变量和基本类型

    而c++有的地方就只是一个语法糖,或者说并没有转化到汇编中,而是直接在编译阶段做一个语法检查就完了。并没有生成汇编代码。也就是说之前写的c/c++不能涵盖它们的全部内容。...而赋值语句结束之后,在其他地方使用赋值语句其进行赋值,被称为赋值。从汇编的角度来看,变量的初始化是,在变量进入它的生命有效期时,那块内存执行的内存拷贝操作。...const int g_i = 10; //在定义的同时也加上extern //1.h extern const int g_i; //在声明时也加上extern,后面需要使用时直接包含该头文件即可...const pci = &i; 如何区分指针常量常量指针,一般来说关注最后两个字,它表示的是const修饰的具体内容,常量指针最后两个字是指针,也就是说const修饰的是指针,指针本身是一个不能修改的...可以在auto前加上一个const修饰变量 const auto f = &ci; //此时f的类型为 const int const* decltype 有了auto就可以很方便的推断出类型了,为什么还有整出一个新的关键字

    1.5K30

    C++ 中 extern 数组和指针

    在一次使用 extern 声明全局变量的过程中,因为数组和指针的混用引发了错误。 我们知道,C++ 中使用 extern 来声明在其他(未使用 include 包含的)文件中的全局变量。...这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量一样,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!...extern char * a; 这是一个外部变量的声明,它声明了一个名为 a 的字符指针,编译器看到这个声明就知道不必为这个指针变量分配空间,这个 .cpp 文件中所有指针 a 的引用都化为一个不包含类型的标号...自身的地址定位到了另一个 .c 文件中定义的数组首地址之上,而不是我们所希望的把数组的首地址赋予指针 a(这很容易理解:指针变量也需要占用空间,如果说把数组的首地址赋给了指针 a,那么指针 a 本身在哪里存放?...extern const int i = 0:定义,i 是全局变量,可以在其他文件中使用。 为什么有 include 还需要 extern

    40800

    C语言变量与常量

    变量的定义是指在使用变量进行声明和初始化的过程。 也就是说,存在包含关系: 关于声明和初始化,我还记得当初学的时候,老师专门强调了这俩不是一回事。...如果在定义时没有提供初始值,变量将有一个未知的、未初始化的值。此时,变量的值是不确定的,需要在使用其进行赋值。...下面这个例子除了文件作用域都用上了: 变量还有个“先声明,后使用”的问题。平时写代码的时候,只要在使用之前定义,就不会出问题。...还有一种很少在课本上出现的定义方式:枚举enum。 可以看出,枚举实际上也是一个int类型。 无论是const还是enum,都要遵循“先声明后使用”的原则。...通过在其他文件中使用extern关键字声明该变量,就可以在其他文件中访问该全局变量。需要注意的是,全局变量对于整个程序是可见的,因此需要小心处理全局变量的使用,以防止命名冲突或意外修改。

    16820

    从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、newdelete 等

    二、const 限定符 (1)、用const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量。...(编译器报警告),什么情况下完全不能修改,当A是加const限定且初始化的全局变量,此时A位于.rodata段(linux 下)。...(2)、const 与 #define const定义的常量与#define定义的符号常量的区别: const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换...extern “C” 可以实现C与C++混合编程,被extern "C" 修饰的变量和函数是按照C语言方式进行编译和链接的,即对C语言写的函数不进行改名,一般在 C的头文件中使用,如果头文件被C代码包含并用...C编译器编译,则__cplusplus 没有定义,extern “C" 被略过,如果头文件被C++代码包含并被C++编 译器编译,存在__cplusplus 定义故extern "c" 提示编译器不要对

    1.2K00

    总结c++ primer中的notes

    C++ 中,把负值赋给 unsigned 对象是完全合法的,其结果是该负数该类型的取值个数求模后的值。...也就是说,赋值时是取该值该类型取值数目求模后的值。然而我们不能保证编译器都会这样处理 signed 类型。 如果您要处理的只是非负整数,那么应该优先使用unsigned 打头的那些整数类型。...还有一些人区分对象和值,用术语对象描述可被程序改变的数据,用术语值描述只读数据。 在本书中,我们遵循更为通用的用法,即对象是内存中具有类型的区域。...而且,没有一个编译器能检测出所有未初始化变量的使用。 有时我们很幸运,使用未初始化的变量导致程序在运行时突然崩溃。一旦跟踪到程序崩溃的位置,就可以轻易地发现没有正确地初始化变量。...可以通过使用extern关键字声明变量名而不定义它。

    1.6K90

    c语言基础学习08_关于内存管理的复习

    extern void test();  //这句话的意思是:函数test已经定义过了,这里只是声明。...void test();          //对于函数来说,没有extern和 有extern 对于c语言是一样的。...实际上静态区是一个综合区,它会分很多子区,其中很多常量也是在静态区另外一个区里面放的。   常量和普通静态变量有什么区别?...因而付出的代价是:不能够选择你到底使用的是堆还是栈。 作为一名使用者,使用c#、java语言,它们已经给你规定好了,有很多类,有很多对象,你尽管拿来用,但是它们这个类或者对象在哪里,我们不知道。...而c++和java还有对象,在c++里面可以指定你的对象在栈里面还是在堆里面,即可以选择效率最高的方法来使用对象,而在java里面所有的对象都是出现在堆里面的。

    48510

    Const的应用与备忘

    前言 const直译“常量”。在软件的开发中,我们会经常需要定义一些不能修改的变量。但在cpp中,由于变量的结构比较复杂,不能修改这个概念,在不同的变量类型中,const的实际意义是不同的。...所以,通过在头文件中定义const对象,可以实现多个文件使用相同的常量值,这在实际的程序中很常见。...那么如何使用其他文件中的const 说到这里,有一点疑问需要解决:如果想在别的文件中访问本文件中的const对象该怎么办,如果都是单是在别的文件中使用extern const int a = 9;的话,...所以应该在需要被其他文件使用的const对象定义成这样:extern const int a = 9;而在别的需要使用这个const对象的地方声明:extern const int a;前者是定义,后者是声明...i和j指向同一块内存,但是*j = 1内存进行修改后,按道理来说,*j==1,i也应该等于1,而实验结果确实i实实在在的等于0,这是为什么,就是本文所说的内容,i是可折叠常量,在编译阶段i的引用已经别替换为

    35220

    iOS小技能: static、extern 存储类的应用(创建共享实例、申明公共方法、全局字符串常量

    当 static 使得一个特定的文件中的函数和变量全局可见,extern 则使它们所有文件可见。...使用extern申明公共方法、全局字符串常量 I 使用static结合线程安全模式来创建共享实例 单例对象应该使用线程安全模式来创建共享实例。...extern申明公共方法、全局字符串常量 3.1 全局字符串常量 全局的字符串常量代替宏常量,节省内存空间。...内存只有一份 使用字符串常量来代替宏的使用: 定义const 全局常量 ,保证只在一处定义,多处进行引用。 全局的const常量代替宏常量,节省内存空间(内存只有一份)。...当 static 使得一个特定的文件中的函数和变量全局可见,extern 则使它们所有文件可见。

    87330

    【计算机本科补全计划】C++ Primer:指针和const限定符

    关键在于以下几点: 指针本身是一个对象,允许其复制和拷贝,并且可以直接指针对象本身进行操作,而不像引用没有对象实体,只能依靠别的对象的苟活。...int* p; int *p; 其实,根本没啥不用,只是让你看着很警惕而已。实际上没有任何的不同,只是第一种写法容易让人误会。 第二种,我应该是都定义了两个指针吧?...任何威胁到const对象的行为都会被当作错误反馈 还有一点,const必须初始化,不然我保护一个对象,对象都没有被初始化,我保护个蛋哟~~所以const是必须被初始化的,不然就报错。...所以前面说过,为什么extern可以初始化?这不是跟定义一样了吗?这就是extern可以初始化的好处了!...如果自己指向别人,不管对方是不是常量,但是如果别人指向自己,那么就要求对方一定要是常量!!不过,我怎么这么喜欢这玩意???

    65740

    C++:18---const关键字(附常量指针、指针常量常量指针常量

    int a=10;const int &b=a; 二、在其他文件中使用const常量extern) const常量默认只能在当前文件使用,可以使用extern使const常量在文件中共享 注意:在别的文件中使用...②其他文件的全局变量会报错,显示重定义 方法: 在demo.h文件中extern const int a;//声明 在demo.c文件中extern const int a=1;(extern可省略)...三、const和引用 把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为“常量的引用” 与普通的引用不同的是,常量的引用不能被用作修饰它所绑定的对象: const int ci =...//因为引用可以通过改变自身值而改变所引用的值,所以为了防止引用改变值,禁止使用普通引用引向const常量 初始化和const的引用 在引用的文章中介绍,引用的类型必须与其引用的对象类型一致,但是有两个例外...const什么起作用: const左边的类型起作用,当const左边没有东西时,才右边的起作用,因此有以下规则: 常量指针时,const左边为int或const左边无内容右边有int,因此只对int

    1.4K10

    CC++ const

    后者表示指针p本身的值不可修改,一旦p指向某个整型变量之后就不能指向其他的变量,即p是个指针常量。 (5)引用本身可以理解为指针常量,在引用前使用const没有意义。...即没有引用常量的说法,只有常引用。常引用指被引用对象是一个常量,不允许通过引用和修改被引用对象的值。 在很多情况下,为表达同一种语义,可将const放在不同的位置。...(2)函数的返回值是值类型时,被const修饰没有意义,因为此时返回值是一个非左 值,本身就不能改变,上例中const int disp3(cons tint& ri)返回值的const限定是多余的...7.extern const使用注意事项 如果在同一个源文件定义const变量,使用extern const去前置申明它时,会发生什么情况,考察如下代码: //main.cpp #include <iostream...如果使用extern const来前置申明一个不具有外部连接性的const变量,是会报错的,因为使用extern申明变量的前提条件是变量具有外部连接性。

    86010

    C++随笔(0)——关于const

    最近发现自己const这一块其实不甚熟悉,所以复习一下const的相关知识点。...在代码运行过程中无法为常量另外赋值: bufSize = 1024; 注意,一定要给定一个值来初始化常量,初始值可以是表达式: const int j = get_size(); const只限定不能执行会更改到内容的操作...如果想要在不同文件中共享一个初始值不是常量表达式的常量,那么就要在定义以及其他文件的声明中加上extern: // file1.cpp extern const int bufSize = fcn();...// file2.cpp extern const int bufSize; 左定值,右定向 const int *p = 8; 上面这样写就是让const修饰指针指向的内容,内容必须是常量。...还有同时修饰指针和指针指向的内容的情况: int a = 8; const int *const p = &a; 修饰成员函数 #include using namespace std

    34930
    领券