extern 关键字的几个特点记录

extern

在 C 和 CPP 文件中,通过extern关键字声明另一个 C/CPP 文件中的变量或函数,可以不包含共同的头文件而直接调用;

如:
run.c / run.cpp

#include <stdio.h>
 
int runValue=7355608;

void runPrint(int value)
{
    printf("Hello,World!\r\n");
    printf("value: %d\r\n", value);
}

main.c / main.cpp

int main(void)
{
    extern int runValue;
    extern void runPrint(void);

    runPrint(runValue);
    return 0;
}

此时两个文件是独立的,没有包含共同的头文件
输出

Hello,World!
value: 7355608

extern "C"

extern "C" 作为C++的关键字使用, 在C中是没有的

而且 extern "C" 直接声明 和 extern "C" {} 块内声明对于变量和函数是不同的
同样是两个独立的cpp文件,各不包含相同的头文件
当 extern "C" 直接声明变量时,作用与 extern 声明变量效果相同
当 extern "C" 直接声明函数时,无法取得与extern声明同样的效果,在其它源文件中无法以此种方式使用函数

run.cpp

#include <stdio.h>
 
int runValue=7355608;

void runPrint(int value)
{
    printf("Hello,World!\r\n");
    printf("value: %d\r\n", value);
}

main.cpp

//声明变量,效果不变
extern "C" int runValue;

//编译器报错
//声明函数,由于定义在另一个不互通的文件中,无法被外部声明到此处,必须包含其头文件
extern "C" void runPrint(void); 

int main(void)
{
    runPrint(runValue);
    return 0;
}

使用extern "C" {} 块声明变量时,变量必须在块内也单独使用extern 声明(无定义文件的头文件引用)

extern "C" {
extern int runValue; 
}

若不在块内声明变量时添加extern关键字,则无法通过编译
使用extern "C" {} 块声明函数时,若不包含定义文件的头文件,则在块内函数无效,添加extern关键字也会编译出错

在块内使用extern

extern "C" {
extern void runPrint(int value); //出错
}

不在块内使用extern

extern "C" {
void runPrint(int value); //出错
}

结论

不使用 extern "C" 直接声明或块内声明在c/cpp源文件的变量,而是直接使用extern声明
用extern单独声明可以安全其他文件中的变量,而不必开放在头文件中(可在局部内extern声明而非必需在全局,被声明的变量必须是全局且非const变量)
(若是被定义的const全局变量需要被其他文件使用,则必须extern声明在头文件中并让调用者包含头文件)

posted @ 2022-01-14 10:44  欲渡黄河  阅读(225)  评论(0)    收藏  举报