// case 1
unsigned int add_two_numbers(unsigned char a, unsigned char b);
//case 2
extern unsigned int add_two_numbers(unsigned char a, unsigned char b);
案例1和案例2有什么区别?我从来没有使用 extern 作为函数原型,但是查看某人的代码(他比我更有经验)我发现在声明函数原型时总是使用 extern 。谁能指出区别吗? (或者指向我可以找到特定信息的链接)。谷歌表示这与外部链接有关。谁能给我举一个例子,其中一个有效,另一个无效?
我正在使用嵌入式 C (KEIL),如果它有什么区别的话。
extern
是全局链接的链接说明符。它的对应项是 static
,它指定文件本地链接。由于全局链接是 C 中的默认设置,因此将 extern
添加到声明中对于函数的声明没有任何影响。对于变量,它会阻止自动内存分配,并且使用它是just在全局范围内声明变量的唯一方法。
如果你只用谷歌搜索关键字,你会发现很多文章,例如这个: 极客的极客
几年前,我从一位经验丰富的程序员那里学到了以下关于变量的知识:
glo.h:
#ifndef EXTERN
#define EXTERN extern
#endif
...
EXTERN int gMyVar;
...
main.c:
#define EXTERN
#include "glo.h"
“glo.h”包含的任何地方都将声明所有全局变量。 main.c 中包含的“glo.h”将为变量分配存储空间。我相信这种方法是常见的做法。
对于(非
inline
)函数,它没有任何区别,如果没有给出存储类说明符,extern
是隐式的(注意,这仅适用于函数,对象是不同的),所以它是只是您使用的风格问题。
我都见过(永远不要将
extern
用于函数/仅将其用于标头中的声明),也许有些人使用 extern
来与对象标识符保持对称,或者使 grep 更容易地查找外部符号。
选择你喜欢的并保持一致,这没有什么区别。
并非所有内容都是为编译器设计的。
当函数在不同的 .cpp 文件中定义时,我个人在函数原型上使用 extern。 这让我(或其他程序员)知道该函数不在该文件中。