当前位置: 首页 > wzjs >正文

深圳市手机网站建设哪家好网络运营商

深圳市手机网站建设哪家好,网络运营商,代理公司的经营范围,wordpress要哪些运行库目录 1. 共享全局变量 2. 共享常量(const)变量 3. 与C语言交互 4. 显式模板实例化声明 5. 动态库符号管理 注意事项 关键总结 在C中,extern关键字主要用于声明变量、函数或模板的外部链接性,表明其定义存在于其他编译单元中…

目录

1. 共享全局变量

2. 共享常量(const)变量

3. 与C语言交互

4. 显式模板实例化声明

5. 动态库符号管理

注意事项

关键总结


在C++中,extern关键字主要用于声明变量、函数或模板的外部链接性,表明其定义存在于其他编译单元中。以下是extern的主要使用场景及示例:

1. 共享全局变量

当需要在多个源文件之间共享全局变量时,使用extern避免重复定义:

问题场景
在多个源文件中直接定义同名全局变量:

// file1.cpp
int globalVar = 10;// file2.cpp
int globalVar = 20;  // 重复定义!

后果

  • 链接阶段会触发 "multiple definition" 错误,违反一次定义规则(ODR)。

解决方案
使用extern声明,单一定义:

// header.h
extern int globalVar;  // 声明// file1.cpp
int globalVar = 10;    // 定义(唯一)// file2.cpp
#include "header.h"
void useVar() { globalVar = 30; }  // 正确使用

示例
考虑如下情形:

.
├── file1.cpp
├── file1.h
├── file2.cpp
├── file2.h
├── global.h
└── main.cpp1 directory, 6 files

代码:

//global.h
#pragma once
int global_var = 10;/***********************************************/
//file1.h
#pragma once
#include "global.h"void func1();/***********************************************/
//file1.cpp
#include "file1.h"
#include<iostream>void func1()
{std::cout<<"func1:"<<global_var<<","<<&global_var<<std::endl;
}/***********************************************/
//file2.h
#pragma once
#include "global.h"void func2();/***********************************************/
//file2.cpp
#include "file2.h"
#include<iostream>void func2()
{std::cout<<"func2:"<<global_var<<","<<&global_var<<std::endl;
}/***********************************************/
//main.cpp
#include "file1.h"
#include "file2.h"int main(int argc,char* argv[])
{func1();func2();return 0;
}

编译报错:

g++   file1.cpp file2.cpp main.cpp  -o demo /usr/bin/ld: /tmp/ccoKZ0nw.o:(.data+0x0): multiple definition of `global_var'; /tmp/ccMc4Z3v.o:(.data+0x0): first defined here
/usr/bin/ld: /tmp/cc743UGw.o:(.data+0x0): multiple definition of `global_var'; /tmp/ccMc4Z3v.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status

解决办法:

修改global.h:

#pragma once
extern int global_var;

增加global.cpp:

#include "global.h"int global_var = 10;

编译:

g++  global.cpp  file1.cpp file2.cpp main.cpp  -o demo 

运行:

func1:10,0x55b9f94d3010
func2:10,0x55b9f94d3010

 可见file1.cpp和file2.cpp中用的是同一个global_var。


2. 共享常量(const)变量

const全局变量默认具有内部链接性(仅在当前文件可见)。若需跨文件共享,需用extern

问题场景
头文件中直接定义const变量:

// constants.h
const double PI = 3.14159;  // 每个包含此头的源文件生成独立副本// file1.cpp
#include "constants.h"  // 生成 PI 副本1// file2.cpp
#include "constants.h"  // 生成 PI 副本2

后果

  • 浪费内存空间(多份相同常量)。

  • 若需统一修改值,需重新编译所有包含该头文件的目标文件。

解决方案
使用extern声明,单一定义:

// constants.h
extern const double PI;  // 声明// constants.cpp
const double PI = 3.14159;  // 唯一定义(extern使常量具有外部链接性)

示例
考虑如下情形:

.
├── constants.h
├── file1.cpp
├── file1.h
├── file2.cpp
├── file2.h
└── main.cpp1 directory, 6 files

代码:

//constants.h
#pragma once
const float PI = 3.14;/*********************************/
//file1.h
#pragma once
#include "constants.h"void func1();/*********************************/
//file1.cpp
#include "file1.h"
#include<iostream>void func1()
{std::cout<<"func1:"<<PI<<","<<&PI<<std::endl;
}/*********************************/
//file2.h
#pragma once
#include "constants.h"void func2();/*********************************/
//file2.cpp
#include "file2.h"
#include<iostream>void func2()
{std::cout<<"func2:"<<PI<<","<<&PI<<std::endl;
}/*********************************/
//main.cpp
#include "file1.h"
#include "file2.h"int main(int argc,char* argv[])
{func1();func2();return 0;
}

编译运行:

$ g++  main.cpp  file1.cpp  file2.cpp   -o demo
$ ./demo 
func1:3.14,0x55c615beb008
func2:3.14,0x55c615beb01c

可以发现,file1.cpp和file2.cpp中的PI不是同一个PI。

解决办法:

修改constants.h:

#pragma once
extern const float PI;

新增constants.cpp:

#include "constants.h"extern const float PI = 3.14;// 测试发现,此处不写extern效果一样

目录结构变为:

.
├── constants.cpp
├── constants.h
├── file1.cpp
├── file1.h
├── file2.cpp
├── file2.h
└── main.cpp1 directory, 7 files

编译运行:

$ g++  main.cpp constants.cpp  file1.cpp  file2.cpp   -o demo
$ ./demo
func1:3.14,0x5639097c8004
func2:3.14,0x5639097c8004

可以看到,file1.cpp和file2.cpp中用的PI是同一个PI。


3. 与C语言交互

避免C++的名称修饰(name mangling),确保C++代码能调用C编译的函数:

问题场景
C++直接调用C函数时,未禁用名称修饰(name mangling):

// c_utils.h
void c_function();  // C函数声明// main.cpp
#include "c_utils.h"
int main() {c_function();  // C++编译后可能生成 _Z11c_functionv 的符号
}

后果

  • C语言编译的库中函数名为c_function,但C++生成修饰名,导致 链接器无法找到符号

解决方案
使用extern "C"禁用修饰:

// c_utils.h
#ifdef __cplusplus
extern "C" {  // 按C规则编译
#endif
void c_function();
#ifdef __cplusplus
}
#endif

4. 显式模板实例化声明

减少编译时间和代码体积,通过extern template避免隐式实例化:

问题场景
多文件中频繁使用同一模板实例:

// utils.h
template<typename T>
class Vector { /*...*/ };// file1.cpp
Vector<int> v1;  // 隐式实例化Vector<int>// file2.cpp
Vector<int> v2;  // 再次隐式实例化Vector<int>

后果

  • 每个编译单元生成相同模板实例化代码,导致 编译时间增加 和 二进制文件膨胀

解决方案
使用extern template声明:

// utils.h
extern template class Vector<int>;  // 声明:不在此处实例化// template_instances.cpp
template class Vector<int>;  // 显式实例化(唯一)

5. 动态库符号管理

问题场景
Windows动态库未显式导出符号:

// dll_lib.h
void dll_function();  // 未声明导出// dll_lib.cpp
void dll_function() {}  // 编译为DLL时符号未导出

后果

  • 其他模块调用时出现 "unresolved external symbol" 错误

解决方案
结合extern和平台特性导出符号:

// dll_lib.h
#ifdef MYLIB_EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endifextern "C" API void dll_function();  // 声明为导出接口

注意事项

  • 一次定义规则(ODR)extern声明的变量/函数必须在程序中唯一一处定义

  • 避免全局变量滥用:过度使用extern变量可能导致代码耦合度高,建议优先使用命名空间或单例模式。

  • 类型一致性extern声明必须与定义处的类型严格匹配。


关键总结

场景不使用的后果extern的作用
跨文件共享全局变量链接错误(ODR违规)分离声明与定义,避免重复定义
跨文件共享常量内存冗余,修改不一致强制外部链接,统一内存实例
C/C++混合编程链接符号找不到禁用c++名称修饰,保持符号一致性
模板优化编译冗余,二进制膨胀抑制隐式实例化,提升编译效率
动态库接口符号不可见,链接失败控制符号可见性,明确导出/导入

核心原则extern通过 声明与定义的分离 和 链接性控制,解决跨编译单元、跨语言的协作问题,是C++模块化开发的关键工具,但需严格遵循语言规范以避免链接错误。

http://www.dtcms.com/wzjs/120484.html

相关文章:

  • 南昌哪里学做网站aso优化服务站
  • 网站搭建准备重庆seo结算
  • 网站优化文章怎么做搜索引擎推广简称
  • 百度网站源码优化检测国家重大新闻
  • 云南网站建设快速优化郑州seo排名优化公司
  • 视频网站开发难点seo服务公司招聘
  • 做类似58类型网站人民网舆情数据中心官网
  • 科技公司网站模版百度推广费用怎么算
  • 做网站需要的素材资料郑州疫情最新情况
  • 把自己做的网站传到网上微信公众号的推广
  • 政府门户网站的重要性百度推广联盟
  • 哪个网站系统做的好巩义网络推广公司
  • 淘宝上做网站 源代码怎么给你seo网络培训学校
  • 郑州网站制作-中国互联怎么创建网站的快捷方式
  • 做伊瑞尔竞技场的网站2022最近热点事件及评述
  • app设计模板网站免费的网络推广平台
  • 做泵阀生意到哪个网站惠州seo全网营销
  • 个人网站用什么域名好营销平台有哪些
  • 非凡网站建设 新三板网址外链平台
  • 电脑QQ浮动窗口怎做电脑网站seo自学网站
  • 做海报网站推广普通话手抄报简单又好看内容
  • 自己有网站怎么推广西安seo网站建设
  • 长沙精品网站制作百度地址
  • 直播网站开发多少钱银川seo优化
  • 网站文件大小怎样建立自己网站
  • 天津做网站美工最新清远发布
  • wordpress栏目布局seo教程网站
  • 黄岩网站建设兼职百度软件下载中心官方网站
  • 遨游建站市场营销策划书
  • 郑州建站怎么操作南平网站seo