当前位置:网站首页>Principle and usage of extern

Principle and usage of extern

2022-07-06 17:53:00 TABE_


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;
}

原网站

版权声明
本文为[TABE_]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202131306192067.html