C++中extern关键字使用

extern关键字使用

extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义。

那么定义在其他文件中的函数和变量,如何通过extern关键字调用呢? 首先,定义在其它文件中的函数和变量,可以使用两种方法调用:

  1. 使用头文件调用,这时候,函数和变量必须在头文件中定义和声明。
  2. 使用extern关键字调用,这时候函数和变量在.cpp或者.c文件中定义和声明。注意:如果一个工程现编译cpp文件,在把多个目标文件链接成为可执行文件,而两个或多个文件中,定义了相同的全局变量,那么,程序编译的时候不会报错,因为编译器单独编译每个文件,在链接可执行文件的时候,由于多个目标文件中含有相同的全局变量,而生成可执行文件的时候,任何文件中定义的全局变量对其它目标文件都是可见的,此时由于变量定义冲突而发生错误。参考如下 代码
// externA.cpp : Defines the entry point for the console application.

#include "example.h"
#include <iostream>
using namespace std;
 
int i;
extern int  fun(int);//这里extern是必须的,函数定义在别的cpp文件中
// externB.cpp : Defines the entry point for the console application.
#include "example.h"
#include <iostream>
using namespace std;
 
int i;
int func(int a)
{
	i = a;
	cout << "i = " << i << endl;
	return 0;
}

单独compile任何一个cpp文件都是对的,但是 编译工程,生成可执行文件的时候报错。原因是:两个.cpp文件中都定义了全局变量i,变量重复定义了。

注意:定义在.h文件中的函数和变量不能使用extern变量声明,原因是#include 在预编译的时候将.h文件中的内容插入了cpp文件中,因此编译器找得到在其它.h文件中定义的变量或者函数。编译的时候,只编译cpp文件的内容,.h文件时不参与编译,如果使用extern声明在.h文件中定义的变量或者函数,那么声明为extern的变量和函数在其它.cpp文件中找不到,因此程序编译的时候就发生了错误。

extern混合编译C语言和C++(因为C语言没有函数重载)

1. 在C++文件中编译C文件需要使用extern "C"关键字,代码如下:
方法1:全局函数和变量在example1.c文件中实现,在example2.cpp文件中使用extern关键字声明在example1.c文件中定义的函数和变量。

// example1.c 
#include <stdio.h>

int i;
void func()
{
	printf("%d",i++);
}
// example2.cpp
#include <stdio.h>
#include <iostream>
using namespace std;

extern "C"
{
	extern int i;
	extern void func();
	//#include "devVar.h" 
}
int main(void)
{
	for (int x = 0;x < 10; x++)
	{
		func();
	}
}

方法2:在example1.h文件中实现C代码(即example1.h作为C语言头文件),在.cpp文件中包含C语言头文件。

// example1.h
#include <stdio.h>

int i;
int func(int a)
{
	i = a;
	cout << "i = " << i << endl;
	return 0;
}
// example2.cpp
#include <stdio.h>
#include <iostream>
using namespace std;

extern "C"
{
	//extern int i;
	//extern void func();
	#include "devVar.h" 
}
int main(void)
{
	for (int x = 0;x < 10; x++)
	{
		func();
	}
}

2. C调用C++编写的代码
需要在example1.cpp中,明确调用extern "C"关键字,声明cpp文件中有关代码,需要按照C的方式来生成,修改example1.cpp文件如下所示:

// example1.cpp
#include <stdio.h>

int i;

extern "C" int func(int a)
{
	i = a;
	cout << "i = " << i << endl;
	return 0;
}

此时,除了需要使用extern "C"声明编译的时候采用C方式编译外,.cpp文件中的代码可以按照C++方式编写。

// example2.cpp
#include <stdio.h>
 
extern int i;
extern int func();
 
int main(void)
{
	int x = 0;
	for (;x < 10; x++)
	{
		func();
	}
}

https://blog.csdn.net/sruru/article/details/7951019

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.h文件使用`extern`关键字来修饰函数的声明是可行的,它可以用于在多个源文件之间共享函数的声明。 通常,.h文件用于存放函数的声明和结构体、枚举等的定义。当多个源文件需要使用相同的函数时,可以在.h文件声明这些函数,并在需要使用它们的源文件包含该.h文件。 当在.h文件声明函数时,使用`extern`关键字可以显式地说明该函数是在其他源文件定义的,而不是在当前源文件定义。这样,在包含该.h文件的源文件,就可以使用该函数而不会导致重复定义错误。 例如,假设有一个functions.h文件,其声明了一个函数: functions.h: ```c extern void sharedFunction(); // 声明一个在其他文件定义的函数 ``` 然后,在其他源文件定义该函数: file1.c: ```c #include "functions.h" void sharedFunction() { // 函数定义 } ``` file2.c: ```c #include "functions.h" int main() { sharedFunction(); // 调用共享的函数 return 0; } ``` 通过在functions.h使用`extern`关键字声明函数,并在其他源文件定义该函数,可以在file2.c使用`extern`关键字来引用共享的函数。 总而言之,虽然在.h文件使用`extern`关键字不是必需的,但它可以显式地声明函数是在其他源文件定义的,从而帮助确保在多个源文件共享函数时不会引起重复定义错误。这样可以提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值