当前位置:网站首页>Principle and usage of extern
Principle and usage of extern
2022-07-06 17:53:00 【TABE_】
Here's the catalog title
extern It can be used to specify links ; It can also be placed in front of variables or functions , A function defined in a file or other variable , Prompt the compiler to look for its definition in other modules when it encounters this variable and function .
Say something reasonable. , It has the following two functions :
- And “C” Continuous use , Such as extern “C” void fun(); Tell the compiler to press C The rules to translate
- Global variable or function declaration , Its declared variables and functions can be found in other modules ( file ) Use in , Be careful , This is just a statement, not a definition , The specific definition should be completed in the specific module
And “C” Continuous use ( Link assignment )
stay CPP You can often see code in the following form in the file :
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
that , What's the use of this way of writing ? actually , This is to make CPP Can and C Interface . The reason for this is , It is because of some differences between the two languages .
because CPP Support polymorphism , That is, functions with the same function name can complete different functions ,CPP It is usually through parameters to distinguish which function is called . At compile time ,CPP The compiler concatenates the parameter type with the function name , So after the program is compiled into the object file ,CPP The compiler can directly link multiple object files into one object file or executable file according to the symbol name in the object file . But in C In language , Because there is no concept of polymorphism ,C When compiling, the compiler will add an underscore in front of the function name , Do nothing ( At least that's what many compilers do ). For this reason , When CPP And C Mixed programming , There could be problems .
Suppose such a function is defined in a header file :
int foo(int a, int b);
The implementation of this function is located in a .c In file , meanwhile , stay .cpp The function is called in the file. . that , When CPP When the compiler compiles this function , It is possible to change the function name to _fooii, there ii Indicates that the first and second parameters of the function are integers . and C The compiler may compile the function name into _foo. in other words , stay CPP In the target file obtained by the compiler ,foo() The function consists of _fooii Symbols to reference , And in the C In the target file generated by the compiler ,foo() The function consists of _foo Referring to .
But when the linker works , It doesn't matter what language the upper level uses , It recognizes only symbols in the target file . therefore , The connector will be found in .cpp Called in foo() function , But it can't be found in other target files _fooii This symbol , Therefore, an error is prompted in the connection process .extern “C” {} This grammatical form is used to solve this problem .
Global variable or function declaration
for instance , We want to declare a long int runtime_minute Variables are used by multiple modules :
//time.h
#ifndef TIME_H
#define TIME_H
// First of all we have time.h Make the following statement :
extern long int runtime_minute;
#endif //TIME_H
Pass... In the header file extern Declared variables are not defined , So we need to time.cpp The definition of :
//time.cpp
#include "time.h"
// stay time.cpp Give in runtime_minute Specific definition of variables :
long int runtime_minute = 0;
At this time , If you want to time2.cpp Use this definition in time.cpp Medium runtime_minute Variable , Just include time.h This header file is enough :
//time2.cpp
#include "time.h"
#include <iostream>
// stay time.cpp Give in runtime_minute Specific definition of variables :
int main(){
runtime_minute++;
std::cout<<runtime_minute<<std::endl;
// Output is 1
return 0;
}
边栏推荐
- Summary of study notes for 2022 soft exam information security engineer preparation
- Xin'an Second Edition: Chapter 12 network security audit technology principle and application learning notes
- Nodejs 开发者路线图 2022 零基础学习指南
- node の SQLite
- 8位MCU跑RTOS有没有意义?
- The art of Engineering (3): do not rely on each other between functions of code robustness
- 【MySQL入门】第三话 · MySQL中常见的数据类型
- In terms of byte measurement with an annual salary of 30W, automated testing can be learned in this way
- 分布式(一致性协议)之领导人选举( DotNext.Net.Cluster 实现Raft 选举 )
- Awk command exercise
猜你喜欢
Optimization of middle alignment of loading style of device player in easycvr electronic map
编译原理——自上而下分析与递归下降分析构造(笔记)
基于STM32+华为云IOT设计的智能路灯
Pourquoi Li shufu a - t - il construit son téléphone portable?
How to use scroll bars to dynamically adjust parameters in opencv
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
Interview shock 62: what are the precautions for group by?
Interview assault 63: how to remove duplication in MySQL?
Zen integration nails, bugs, needs, etc. are reminded by nails
Summary of Android interview questions of Dachang in 2022 (II) (including answers)
随机推荐
Establishment of graphical monitoring grafana
Compile and build, from the bottom to the top
kivy教程之在 Kivy 中支持中文以构建跨平台应用程序(教程含源码)
Growth of operation and maintenance Xiaobai - week 7
Summary of Android interview questions of Dachang in 2022 (I) (including answers)
Chrome prompts the solution of "your company management" (the startup page is bound to the company's official website and cannot be modified)
[introduction to MySQL] the first sentence · first time in the "database" Mainland
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
学 SQL 必须了解的 10 个高级概念
ASEMI整流桥DB207的导通时间与参数选择
The art of Engineering (3): do not rely on each other between functions of code robustness
OpenCV中如何使用滚动条动态调整参数
Nodejs developer roadmap 2022 zero foundation Learning Guide
Xin'an Second Edition; Chapter 11 learning notes on the principle and application of network physical isolation technology
EasyCVR接入设备开启音频后,视频无法正常播放是什么原因?
[ASM] introduction and use of bytecode operation classwriter class
【ASM】字节码操作 ClassWriter 类介绍与使用
After entering Alibaba for the interview and returning with a salary of 35K, I summarized an interview question of Alibaba test engineer
远程代码执行渗透测试——B模块测试
面试突击63:MySQL 中如何去重?