函数原型上的 extern?

问题描述 投票:0回答:4

我的数学.h

// 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),如果它有什么区别的话。

c extern function-prototypes
4个回答
18
投票

extern
是全局链接的链接说明符。它的对应项是
static
,它指定文件本地链接。由于全局链接是 C 中的默认设置,因此
extern
添加到声明中对于函数的声明
没有任何影响。对于变量,它会阻止自动内存分配,并且使用它是just在全局范围内声明变量的唯一方法。

如果你只用谷歌搜索关键字,你会发现很多文章,例如这个: 极客的极客


2
投票

几年前,我从一位经验丰富的程序员那里学到了以下关于变量的知识:

glo.h:
#ifndef EXTERN
#define EXTERN extern
#endif
...
EXTERN int gMyVar;
...

main.c:
#define EXTERN
#include "glo.h"

“glo.h”包含的任何地方都将声明所有全局变量。 main.c 中包含的“glo.h”将为变量分配存储空间。我相信这种方法是常见的做法。


1
投票

对于(非

inline
)函数,它没有任何区别,如果没有给出存储类说明符,
extern
是隐式的(注意,这仅适用于函数,对象是不同的),所以它是只是您使用的风格问题。

我都见过(永远不要将

extern
用于函数/仅将其用于标头中的声明),也许有些人使用
extern
来与对象标识符保持对称,或者使 grep 更容易地查找外部符号。

选择你喜欢的并保持一致,这没有什么区别。


0
投票

并非所有内容都是为编译器设计的。

当函数在不同的 .cpp 文件中定义时,我个人在函数原型上使用 extern。 这让我(或其他程序员)知道该函数不在该文件中。

© www.soinside.com 2019 - 2024. All rights reserved.