extern 相关

假如a.h中有 int a=10; t1.cpp和t2.cpp同时include "a.h"则编译不成功,因为a重复定义;
如果 a.h中是 static int a=10;则可以,因为t1和t2中的a只是名字相同,地址空间不同;
如果a.h中是 extern int a; 并且在a.cpp中 int a=10; 则t1和t2中的a指向同一个地址空间。

 

 

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

转载于:https://www.cnblogs.com/Browneyes/p/5995423.html

<think>好的,用户想了解C++中extern关键件的用法和示例。首先,我需要回顾extern的基本概念,确保自己理解正确。extern主要用于声明变量或函数是在其他文件中定义的,这样编译器在编译当前文件时不会报错,链接时再去寻找实际的定义。 接下来,我需要组织回答的结构。可能分为变量声明、函数声明、注意事项和应用场景几个部分。用户提供的引用中有提到extern在多个文件间共享声明,促进代码重用,这点需要强调。例如,引用[1]和引用[2]中的例子展示了如何在file2.cpp中使用extern声明g_var,然后在file1.cpp中定义它,这样在func中就能正确输出值。 要注意区分声明和定义。使用extern时,变量只是声明而不是定义,所以不会分配内存。这在多个文件共享全局变量时特别重要。例如,在头文件中使用extern声明全局变量,然后在源文件中定义,这样可以避免重复定义的错误。 关于函数的extern用法,虽然函数默认是extern的,但显式声明可以增强可读性,尤其是在跨语言调用时,比如C++调用C函数,需要用extern "C"来避免名称修饰问题。但用户的问题可能更关注变量,所以这部分可以简要提及。 用户提供的引用[3]提到C++11标准,可能需要确认extern在C++11中有没有变化,但据我所知,extern的基本用法没有太大变化,所以可能不需要特别提到C++11,除非有相关特性。不过可以提到在C++中,extern也可以用于模板的显式实例化声明,但用户的问题可能更基础,所以暂时不考虑这个。 然后需要生成相关问题。根据extern的常见疑惑点,可能的问题包括extern与全局变量的区别、头文件中使用extern的最佳实践、extern "C"的作用,以及extern在大型项目中的应用。这些问题可以帮助用户深入理解。 还要检查是否有遗漏的重要点,比如extern在头文件中的使用,避免多次包含导致重复声明。例如,在头文件中声明extern变量,然后在对应的源文件中定义,这样多个包含该头文件的文件都能正确引用同一个变量。 最后,确保示例代码正确,比如引用[2]中的例子,展示file1.cpp定义变量,file2.cpp通过extern声明使用,这能直观说明extern的作用。同时,注意代码格式使用正确的LaTeX标注,如变量名用$g\_var$,但用户示例中的代码块不需要数学格式,所以可能不需要处理。 总结,回答结构应清晰,分点说明,包含变量和函数的用法,注意事项,示例,以及相关问题。需要确保引用正确,如引用[1]和引用[2]支持extern的作用和示例,引用[3]可能不太相关,但用户提供了三个引用,可能需要都引用到,但实际内容中引用[3]关于C++11可能不相关,所以可能只在需要时提及。</think>### C++ `extern`关键字的用法解析 `extern`是C/C++中用于**声明外部链接**的关键字,主要用于以下场景: --- #### 一、变量声明 1. **跨文件共享全局变量** 在头文件中声明全局变量时使用`extern`,实际定义在源文件中完成: ```cpp // header.h extern int g_counter; // 声明(不分配内存) // file1.cpp #include "header.h" int g_counter = 0; // 定义(分配内存) // file2.cpp #include "header.h" void increment() { g_counter++; } ``` 这种设计避免多文件包含时的重复定义问题[^1]。 2. **示例对比** - 错误写法(重复定义): ```cpp // file1.cpp int var = 5; // file2.cpp int var = 10; // 链接错误 ``` - 正确写法: ```cpp // file1.cpp int var = 5; // file2.cpp extern int var; // 正确引用file1中的var ``` --- #### 二、函数声明 1. **跨文件调用函数** `extern`可显式声明函数的外部链接性(通常可省略,因为函数默认是`extern`的): ```cpp // utils.h extern void log_message(const std::string& msg); // utils.cpp void log_message(const std::string& msg) { /* 实现 */ } ``` 2. **C/C++混合编程** 通过`extern "C"`禁用C++的名称修饰(name mangling): ```cpp #ifdef __cplusplus extern "C" { #endif void c_library_function(); // 以C方式编译 #ifdef __cplusplus } #endif ``` --- #### 三、注意事项 1. **避免头文件直接定义变量** 错误示例: ```cpp // header.h extern int value = 42; // 实际成为定义而非声明 ``` 正确做法:头文件仅声明,源文件定义。 2. **作用域限制** `extern`变量需在全局或命名空间作用域声明,不能在局部作用域使用。 --- #### 四、应用场景 - 模块化开发中共享全局状态(如配置参数) - 跨语言接口设计(如调用C库) - 大型项目中分离接口与实现 ```cpp // 示例:多文件共享配置 // config.h extern const int MAX_THREADS; // config.cpp const int MAX_THREADS = 8; // worker.cpp #include "config.h" void init() { std::cout << MAX_THREADS; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值