`extern`关键字在c99标准中是可选的吗?

时间:2014-01-17 08:36:26

标签: c error-handling output keyword extern

第一个文件是

/* OTHER.C */
#include <stdio.h>
#include <stdlib.h>

int i=35;
int fun1()
{
    i++;
    printf("%d\n",i);
    return 0;
}
int fun2()
{
    i--;
    printf("%d\n",i);
    return 0;
}

第二个文件是

/* MAIN.C */

#include <stdio.h>
#include "other.c"

int main()
{
    printf("%d\n",i);//WORKING FINE EVEN WITHOUT THE USE OF extern int i;

    fun1();//working fine

    fun2();//working fine

    getch();
    return 0;
}

#include "other.c" main.c之后,变量i以及fun1()fun2()工作正常,即使未在main.c中声明为{ {1}}以及extern int iextern int fun1()

但在extern int fun2()之类的旧编译器中,它显示错误turbo c

这是undeclared variable i标准添加的附加功能吗?

1 个答案:

答案 0 :(得分:4)

#include预处理程序指令的作用是在#include的位置实际和物理地包含该文件。

编译器正确处理所谓的translation units,它是所有包含和宏替换之后预处理器的输出。

所有这些意味着编译器看不到不同的文件,它只看到一个大文件,在您的情况下包含来自other.c的代码。

处理这类事情的常用方法是制作一个标题文件,例如{(1}}主文件将包含,然后包含函数原型(声明)。然后让构建系统生成两个目标文件,每个源文件一个,并将链接目标文件一起生成一个可执行文件。

如果你正在使用other.h,最容易做到这一点:

gcc

这告诉编译器将文件$ gcc main.c other.c -o myprogram main.c编译为临时对象文件,然后将它们链接在一起以创建other.c可执行文件。

为此,您可能需要创建一个声明所需内容的头文件:

myprogram

/* OTHER.H */ #ifndef OTHER_H #define OTHER_H extern int i; int fun1(); int fun2(); #endif 文件main.c标题中,而不是源文件。