当前位置:网站首页>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;
}
边栏推荐
- Getting started with pytest ----- allow generate report
- 10 advanced concepts that must be understood in learning SQL
- Pytest learning ----- detailed explanation of the request for interface automation test
- Flet教程之 13 ListView最常用的滚动控件 基础入门(教程含源码)
- 面试突击63:MySQL 中如何去重?
- Binary search strategy
- BearPi-HM_ Nano development environment
- Scratch epidemic isolation and nucleic acid detection Analog Electronics Society graphical programming scratch grade examination level 3 true questions and answers analysis June 2022
- Unity particle special effects series - treasure chest of shining stars
- C# NanoFramework 点灯和按键 之 ESP32
猜你喜欢
分布式不来点网关都说不过去
Getting started with pytest ----- test case pre post, firmware
SAP UI5 框架的 manifest.json
Summary of Android interview questions of Dachang in 2022 (II) (including answers)
BearPi-HM_ Nano development board "flower protector" case
Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
历史上的今天:Google 之母出生;同一天诞生的两位图灵奖先驱
The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement
QT中Model-View-Delegate委托代理机制用法介绍
学 SQL 必须了解的 10 个高级概念
随机推荐
[rapid environment construction] openharmony 10 minute tutorial (cub pie)
How to use scroll bars to dynamically adjust parameters in opencv
Olivetin can safely run shell commands on Web pages (Part 1)
The shell generates JSON arrays and inserts them into the database
【MySQL入门】第三话 · MySQL中常见的数据类型
[getting started with MySQL] fourth, explore operators in MySQL with Kiko
The art of Engineering (2): the transformation from general type to specific type needs to be tested for legitimacy
Getting started with pytest ----- allow generate report
Alibaba brand data bank: introduction to the most complete data bank
The easycvr platform reports an error "ID cannot be empty" through the interface editing channel. What is the reason?
Today in history: the mother of Google was born; Two Turing Award pioneers born on the same day
偷窃他人漏洞报告变卖成副业,漏洞赏金平台出“内鬼”
[translation] principle analysis of X Window Manager (I)
Single responsibility principle
Unity particle special effects series - treasure chest of shining stars
趣-关于undefined的问题
Interview assault 63: how to remove duplication in MySQL?
Solid principle
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
MySQL stored procedure