繁体   English   中英

C 中 function 的外部链接,不带“extern”可以吗?

[英]extern linkage of function in C, is it okay to not be with “extern”?

您好,我正在查看 function 和 C 中的变量的外部链接示例。

这是一个产生随机变量的例子。

  1. 随机.c
#define SEED 20
#define MULT 3124
#define INC 2345
#define MOD 5436

unsigned int call_count = 0; 

static unsigned seed = SEED;  

unsigned random_i(void) {

    seed = (MULT * seed + INC) % MOD;

    call_count++;

    return seed;

}

double random_f(void) {

    seed = (MULT * seed + INC) % MOD;
    call_count++;

    return seed / (double)MOD;
}
  1. 这是main.c
#include <stdio.h>
#include <stdlib.h> 

#pragma warning (disable:4996)

unsigned random_i(void); // I wonder why this prototype has no "extern" specifier
double random_f(void); // I wonder why this prototype has no "extern" specifier

extern unsigned call_count;

int main(void) {

    register int i;

    for (i = 0; i < 10; i++)
        printf("%d ", random_i());

    printf("\n");

    for (i = 0; i < 10; i++)
        printf("%lf ", random_f());

    printf("\nCall count : %d\n", call_count);
    
    return 0;
}

在这个简短的程序中,我想知道为什么两个 function 原型的那些没有“ extern ”说明符以及为什么这段代码编译没有错误。

因为我知道的是,当我使用其他源代码中的变量或函数时,我必须使用extern说明符,例如extern int a=10; .

请告诉我。

谢谢。

function 块之外的函数和数据定义都具有隐式外部链接。 但是,当它涉及到声明时,数据 object 需要extern关键字,否则它是一个定义 对于函数,原型显然不是定义,因为它没有主体。

关于:

我必须使用 extern 说明符,例如extern int a=10;

不完全是,在这种情况下extern int a=10; 是定义而不是声明,因为您包含了初始化程序。 int a=10; 如果也在别处定义,将导致重复定义错误。

默认情况下,全局 scope 处的符号在外部可见。 这适用于变量和函数。 仅需要extern关键字来防止符号的多个定义。 它指出当前声明在别处定义。

call_count 需要extern ,否则它将是一个定义。 全局函数的声明不需要它,因为没有定义。

注意

extern int a=10;

在 gcc 中生成警告:

warning: ‘a’ initialized and declared ‘extern’ 

默认情况下,所有函数都是 extern ,因此原型不需要extern 但是,如果您愿意,当然可以使用它。

unsigned random_i(void); === extern unsigned random_i(void);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM