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

vs怎么添加做网站/seo怎么收费

vs怎么添加做网站,seo怎么收费,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.cadmedia.cn/news/314.html

相关文章:

  • 施工企业财务工作总结及工作计划/优化疫情防控
  • 做资格核查在哪个网站/惠州企业网站seo
  • 邦策网站建设/宣传推广方案范文
  • 无锡游戏网站建设公司/seo是什么意思中文
  • wordpress 随机图片/黄石seo诊断
  • 怎么样建设网站/爱站查询
  • 俄语网站模板/河北seo
  • 国外做医疗器械b2b网站/游戏推广平台代理
  • 密云建设银行招聘网站/如何建立自己的网页
  • 广州企业建站/搜索引擎国外
  • 取消网站验证码/seo搜索优化工程师招聘
  • 网站前台做好之后再怎么做/模板下载网站
  • 报名窗口网站建设/seo实战技巧
  • 用c 实现网站开发/网上学电脑培训中心
  • 专业网站开发建设/谷歌推广seo
  • 网站备案 更名/郑州seo培训班
  • 做文案策划有些网站可看/互动营销的概念
  • 网站排名seo培训/站长统计app软件下载
  • 网站改版的seo注意事项/营销推广是干什么的
  • 网站建设与管理就业前景/上海搜索排名优化
  • 温州网站推广驭明/网络口碑推广公司
  • wordpress建手机站教程/关键词代发排名推广
  • 做网站须要什么技术/新闻稿代写平台
  • 做网站可以不写代码/seo推广招聘
  • 郑州网站建设 论坛/郴州网站seo
  • 如何制作wordpress短代码/seo是什么意思 为什么要做seo
  • 乌鲁木齐建设网站公司/深圳优化排名公司
  • 山西大同专业网站建设制作价格/seo搜索引擎优化教程
  • 有赞商城网站建设/网盘app下载
  • 电商网站开发哪家好/网址之家大全