关于extern和inline的用法

来源:互联网 发布:ps软件多大内存 编辑:程序博客网 时间:2024/04/28 11:36

extern 

用白话文来讲,就是此处我需要用到函数或者变量,我在其他地方已经声明了,在哪声明的?你只管用就行,不需要知道在哪声明的。

举个例子,b.c中有一个函数 int add (a,b),在a.c中我们可以直接声明 extern int add (a,b),不需要写函数实现,然后在a.c中调用int add(a,b)即可。

这样做的优缺点:

优点,在大型项目中,能有效避免引入头文件的烦恼。同时,会加速编译(预处理)的过程,节省时间。

缺点,如果你把function的名字记错了,比较悲催。


另外,extern修饰符可用于指示C或者C++函数的调用规范,比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用。 
有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。 
这种想法其实是很多初学者都会想到的,想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o). 也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。 
正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了


inline

用白话文讲,有点类似于宏定义,但是于宏定义又有本质的区别。

1)#define不会进行参数有效性检查

2)#defile其返回值不能被强制转换成可转换的适合的转换类型。

3)格式上,inline函数就像平常写函数一样,加上“inline”即可,#define格式要求比较多。

inline函数与调用普通函数的区别是,inline函数在编译的时候是直接调用,而普通函数在编译时会调用call命令,然后将call命令的地址入栈,执行时间inline要比普通函数高。

一般我们会在inline函数声明时加上static,这样在同一个工程中,即使出现同名同参数的函数也不会引起重复定义的错误。

static全局变量只在声明此static全局变量的文件中有效,普通全局变量对整个源程序都有效,当此源程序包含多于一个文件的程序时,对其他文件依然有效。


0 0
原创粉丝点击