生存域问题
下面的代码会报错
#include <stdio.h>
#include <stdlib.h>
void func(void);
int main(void)
{
func();
count++;
printf("In main,count=%d\n",count);
return 0;
}
int count;
void func(void)
{
count++;
printf("In func ,count=%d\n",count);
}
因为C语言的从上到下的作用域规则,count在没声明之前找不到,会进行报错。
如果要告诉编译器,该变量在其他地方已经定义,
#include <stdio.h>
#include <stdlib.h>
void func(void);//告诉编译器,文件中一定有这个函数的定义,先别忙着报错
int main(void)
{
extern int count;
func();
count++;
printf("In main,count=%d\n",count);
return 0;
}
int count;
void func(void)
{
count++;
printf("In func ,count=%d\n",count);
}
变量和声明
链接属性
先生成汇编再生成机器代码后和lib库链接生成可执行文件。
编译过程详解
预处理(Pre-Processing)-- 对 C 语言进行预处理,生成 test.i 文件 编译(Compiling)-- 将上一步生成的 test.i 文件编译生成汇编语言文件,后缀名为 test.s 汇编(Assembling)-- 将汇编语言文件 test.s 经过汇编,生成目标文件,后缀名为 test.o 链接(Linking)-- 将各个模块的 test.o 文件链接起来,生成最终的可执行文件
多个c文件的编译过程
#include <stdio.h>
void a(void);
void b(void);
void c(void);
int count;
int main()
{
a();
b();
c();
printf("XXXXX%d次\n",count);
return 0;
}
举例
extern int count ;
void a(void)
{
count++;
}
#include <stdio.h>
void a(void);
void b(void);
void c(void);
static int count;//就会取消extern的作用 变成内部变量
int main()
{
a();
b();
c();
printf("XXXXX%d次\n",count);
return 0;
}