C中函数的extern链接,不使用“extern”可以吗?

问题描述

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

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

  1. random.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;
}

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

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

请告诉我。

谢谢。

解决方法

功能块之外的函数和数据定义都有隐式外部链接。然而,当它归结为声明时,数据对象需要extern关键字,否则它是一个定义。对于函数来说,原型显然不是定义,因为它没有函数体。

关于:

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

不完全是,在这种情况下,extern int a=10; 是定义而不是声明,因为您已包含初始化程序。它与 int a=10; 相同,如果在其他地方也定义会导致重复定义错误。

,

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

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

注意

extern int a=10;

在 gcc 中生成警告:

warning: ‘a’ initialized and declared ‘extern’ 
,

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

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