刚试出的extern一些以及联想到的,记录以备不忘

本文探讨了C++中extern关键字的使用方法,特别是extern与const结合使用的情况,对比了C语言中的处理方式,并讨论了static的作用域特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、

学c的时候,接触过extern,没深入研究,直到最近看c++编程思想,看到178页extern const int x=100;

对extern进行测试,首先test2.cpp如下内容

然后test.cpp

 

 


不过由于有第2行,所以实际上加入不加入extern都是可以的

然后删掉#include "test2.cpp"和extern语句,在命令行下g++ test2.cpp test.cpp -o test 之后,会出现警告如下

 

(对文件的连编,直接在工程里添加文件或者用g++连编都可以)

将extern语句加上就好了

 

2、

至于const int x 的extern

测试如下

text2.cpp

test.cpp

不对x进行cout则能通过,不会报错

在test2.cpp中改为


即可。

而在c语言中,则不需要对const进行extern,测试如下:

test2.c中

test.c中

可以输出结果为100。可以看到在C++中必须在定义处加上extern才能编译并运行,为什么呢?

 

      这涉及C和C++对const的不同处理

  在c中,默认const为外部连接,而C++默认const是内部连接,所以如果在C++中想完成C中同样的事情,必须用extern明确把连接改为外部连接(当然,在C语言中也可以这样)

  因为C++的const默认内部连接,所以不能一个文件定义const而在另一个文件中又把它作为extern来引用。为了使const成为外部连接,必须定义为extern,此处我们在test2.cpp中改为

就通过进行初始化并指定为extern,我们强迫给这个const分配了内存。(因为const在C++中不必创建内存空间,是否创建依赖于它的使用。一般来说,一个const仅仅用来把名字用一个值替代,如同#define,则存储空间就不必创建,如果取一个const的值得或者把它定义为extern,则会为该const创建内存空间。)

 

3、

   说到const默认为局部变量,想到个static的局部性

  stati有个优点,在函数范围之外,不可用,所以不能轻易改变,这样错误就局部化了。C++编程思想70页示范代码:

static另一个作用,在某个作用域外不可访问。

test2.cpp内容如下:

test.cpp如下:

 

(这里也可以将两个文件的extern和static互换,结果一样)

会得到编译错误,尽管变量fs被声明为extern不过定义为static,同样文件外不可用

即:当static被应用于函数名和所以函数外部的变量时,文件的外部不可以使用这个名字。函数名或变量是局部于文件的,即有文件作用域

 

好,记完,只供自己参考

 

另外,参考下

http://blog.csdn.net/hangyu628/archive/2009/01/29/3854487.aspx

 

参考网址

1、http://blog.csdn.net/keensword/archive/2005/06/23/401114.aspx

 

### 关于 `extern` 关键字的用法与含义 在 C 和 C++ 编程语言中,`extern` 是一个关键字,用于声明变量或函数的存在而不定义它们。这意味着当使用 `extern` 时,编译器知道该标识符(变量或函数)是在其他地方定义的,并且会在链接阶段解析其实际定义。 #### 在 C 中的用法 在 C 中,`extern` 通常用于声明全局变量或函数,表明这些实体是在另一个源文件中定义的。例如: ```c // File1.c int global_var = 10; // File2.c extern int global_var; // 声明 global_var 的存在 void print_global() { printf("%d\n", global_var); // 使用 global_var } ``` 这里,`extern` 告诉编译器 `global_var` 是在其他地方定义的全局变量[^3]。 #### 在 C++ 中的用法 在 C++ 中,`extern` 的功能与 C 类似,但可以扩展到更复杂的场景,例如类型修饰符和链接规则。例如: ```cpp // File1.cpp int global_var = 10; // File2.cpp extern int global_var; // 声明 global_var 的存在 void print_global() { std::cout << global_var << std::endl; // 使用 global_var } ``` 此外,在 C++ 中,`extern` 还可以用来指定外部变量的链接方式。例如,`extern "C"` 用于告诉编译器以 C 链接方式处理某些函数或变量,避免 C++ 的名称修饰问题: ```cpp extern "C" { void c_function(); // 声明一个具有 C 链接的函数 } ``` 这在调用 C 库中的函数时特别有用[^4]。 #### 结合引用内容的解释 在提供的引用中,`extern function void add_node();` 表示 `add_node` 函数的声明位于其他地方,具体实现可能在不同的文件中完成。类似地,在引用[2]中,`PySpam_System()` 是一个静态函数,而如果需要在其他文件中访问类似的函数,则可以使用 `extern` 来声明它[^5]。 ### 示例代码 以下是一个完整的例子,展示如何在 C 和 C++ 中使用 `extern`: ```c // File1.c #include <stdio.h> int global_var = 42; void set_global(int value) { global_var = value; } // File2.c #include <stdio.h> extern int global_var; // 声明 global_var extern void set_global(int); // 声明 set_global 函数 void print_global() { printf("Global var: %d\n", global_var); } int main() { print_global(); set_global(100); print_global(); return 0; } ``` ```cpp // File1.cpp #include <iostream> int global_var = 42; void set_global(int value) { global_var = value; } // File2.cpp #include <iostream> extern int global_var; // 声明 global_var extern void set_global(int); // 声明 set_global 函数 void print_global() { std::cout << "Global var: " << global_var << std::endl; } int main() { print_global(); set_global(100); print_global(); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值