• 关键字extern用法


    extern作用:在某个.cpp文件中存在这么一个函数/全局变量

    声明外部函数

    a.cpp中使用b.cpp中函数,需要在a.cpp中函数使用之前用extern修饰函数声明。

    a.cpp

    #include 
    
    extern double area(int num);
    
    int main()
    {
    	double r;
    	std::cout << "Please enter radius of circle: " << std::endl;
    	std::cin >> r;
    
    	std::cout << area(r) << std::endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    b.cpp

    #define PI 3.1415926
    
    double area(int num) {
    	return PI * num * num;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出

    Please enter radius of circle:
    1
    3.14159
    
    • 1
    • 2
    • 3

    注:a.cpp中函数声明是可以省略extern关键字的。

    声明外部全局变量

    a.cpp中使用b.cpp中全局变量,需要在a.cpp中变量使用之前用extern修饰变量声明。

    b.cpp

    int a = 10;
    
    • 1

    a.cpp

    #include 
    
    extern int a;
    
    int main()
    {
    	std::cout << "a = " << a << std::endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注:a.cpp中全局变量的声明是不能加初始值的。

    若是将代码改成:

    extern int a = 1;
    
    • 1

    则会报错

    D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
    
    • 1

    extern关键字修饰的函数或全局变量,在自己的cpp文件中定义也是可以的。

    例如:main.cpp

    #include 
    
    extern int a;
    extern int b;
    extern int sum(int num1, int num2);
    
    int a;
    int b;
    
    int main()
    {
    	a = 10; b = 20;
    	std::cout << "sum = " << sum(a, b) << std::endl;
    
    	return 0;
    }
    
    int sum(int num1, int num2) {
    	return num1 + num2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出

    sum = 30
    
    • 1

    关于重定义

    在多个cpp中,不能定义相同名字的符号。

    1. 不能定义相同名称的全局变量

    例如,a.cppb.cpp中存在相同的全局变量。

    a.cpp

    #include 
    
    int a;
    
    int main()
    {
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    b.cpp

    int a;
    
    • 1

    报错

    D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
    
    • 1
    1. 不能定义相同的函数。(函数相同:函数名+参数列表相同)

    例如,a.cppb.cpp中存在相同的函数。

    a.cpp

    #include 
    
    int sum(int num1, int num2) {
    	return num1 + num2;
    }
    
    int main()
    {
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    b.cpp

    int sum(int num1, int num2) {
    	return num1 + num2;
    }
    
    • 1
    • 2
    • 3

    报错

    D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
    
    • 1

    C++是允许函数重载的,当函数名相同,参数列表不同时,编译器不会报错。例如:

    a.cpp

    #include 
    
    int sum(int num1, int num2) {
    	return num1 + num2;
    }
    
    int main()
    {
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    b.cpp

    int sum(int num1, int num2, int num3) {
    	return num1 + num2 + num3;
    }
    
    • 1
    • 2
    • 3
    1. 无定义的错误

    当在一个cpp文件中声明了一个函数,并且调用它。但是在链接过程中没有发现任何一个cpp文件中定义了。例如:

    只在main.cpp中声明函数sum

    #include 
    
    extern int sum(int num1, int num2);
    
    int main()
    {
    	sum(10, 20);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    error LNK2019: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),函数 main 中引用了该符号
    
    • 1
  • 相关阅读:
    基于HFSS的线阵综合分析
    免杀对抗-C#+go语言-混淆+防反编译+分离
    一键复制 — vue
    华为机试真题 Python 实现【最大平分数组】【2022.11 Q4新题】
    常用电路符号
    UER(腾讯)
    前端ES6 面试过关宝典
    SPC 统计过程控制
    Python自动化测试框架pytest的详解安装与运行
    Linux内核8. Linux内核的经典调试方式
  • 原文地址:https://blog.csdn.net/Star_ID/article/details/126598213