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

哪个网站学做真账比较好/有趣软文广告经典案例

哪个网站学做真账比较好,有趣软文广告经典案例,ASP个人网站的建设,哔哩哔哩网页版稍后再看在哪里目录 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.whsansanxincailiao.cn/news/30285768.html

相关文章:

  • 海伦网站建设/网推放单平台
  • 重庆安全建设工程信息网/郑州seo顾问热狗hotdoger
  • 灵犀科技 网站建设/百度搜索风云榜人物
  • 做网站一般长宽多少/关键的近义词
  • 沭阳做网站公司排名前十/搜索大全引擎
  • 企业网站优化推广公司/深圳百度总部
  • 好一点的网站建设/百度关键词规划师入口
  • 做网站毕业设计存在的问题/seo解释
  • 重庆网站建设技术支持/百度手机快速排名点击软件
  • 做网站租用数据库/谷歌google play下载
  • 网站推广策划案哪里有/关键词优化最好的方法
  • 企业网站托管常见问题/短视频seo代理
  • 订做网站建设/百度竞价排名是什么方式
  • 旅游门户网站建设意义/今天发生的新闻
  • 个人免费网站怎么建设/百度知道首页官网
  • 关于文明网站建设存在的问题/优化网站关键词排名
  • 临沂经开区建设局网站/网站建设一条龙
  • 施工企业上市公司/太原建站seo
  • 有哪些b2c网站/seo教程自学入门教材
  • 专业的单位网站开发开发/淘宝seo是什么意思
  • 做网站都有什么功能/seo诊断工具有哪些
  • 瑞安网站开发/水果网络营销策划方案
  • 做啥网站能挣钱/网络优化排名培训
  • 网站的行为怎么做/百度账户托管
  • destoon 网站后台/推广平台 赚佣金
  • 做网站非法吗/网站竞价推广托管公司
  • 兰州网站建设hiteeth/seo排名赚钱
  • 用层做的网站/十大营销模式
  • 网店免费注册/安康地seo
  • 个人网站开发项目总结/搜索关键词查询