第一个文件是
/* 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 i
和extern int fun1()
。
但在extern int fun2()
之类的旧编译器中,它显示错误turbo c
。
这是undeclared variable i
标准添加的附加功能吗?
答案 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
标题中,而不是源文件。