C语言多文件编译与文件操作(linux)

一、多文件编程

1、多文件编程步骤

①把所有函数分解在不同的源文件里,主函数要是单独的文件

②为每个源文件编写以.h作为拓展名的头文件,主函数不需要头文件,只要是不分配内存的内容都可以写在头文件里,至少要包含配对源文件所有函数的声明语句

③在所有源文件里使用#include指令包含必要的头文件,配对头文件都是必要的头文件

④为了防止多个函数包含同样的头文件造成重复编译,需要为头文件加上头文件卫士(#ifndef.....#define.....#endif),意思是如果定义了该宏,就不在重复定义,保证了头文件只被编译一次,也就是条件编译

例如:

//此为add.c文件
#include"add.h"
int add(int val,int val1){
    return val+val1;
}



//此为add.h文件
#ifndef _ADD_H
#define _ADD_H
#include<stdio.h>
int add(int,int);//函数声明
#endif



//此为main.c文件
#include"add.h"
int main(void){
    printf("%d\n",add(5,8));
    return 0;
}

2、gcc的编译过程(从.c源码到可执行文件)

用图来说明一下,基本通过这几步得到一个可执行文件

  gcc的其他选项
    -o ,认为给定输出的可执行文件名,如果不给出这个选项,gcc就给出预设的可执行文件a.out。
    -g,产生符号调试工具(GNU的gdb),要想对源代码进行调试,我们就必须加入这个选项。 
    -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化               处理,这样产生的可执行文件的执行效率可以提高,    但是,编译、连接的速度就相应地               要慢一些。


    -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

    -D ,可以在后面定义宏名

3、条件编译

从几组语句中选择一组进行编译

#ifdef.....#else.....#endif  //如果定义了宏,则编译ifdef下语句,否则执行else下语句

#ifndef.....#else......#endif  //与上述效果相反

#if.........#elif(任意多次)......#else........#endif //可以根据宏的定义从多组语句中选择一组编译,#if                                                                          //和#elif后写逻辑表达式,可以包括任意逻辑操作符

例如:

#include<stdio.h>
int main(void){
#ifdef HP
    printf("ok\n");
#else
    printf("error\n");
#endif
    return 0;
}
//直接运行时结果会打印error
//如果编译时 gcc -D HP去定义这个宏,运行结果会打印ok
//如果把#ifdef换成#ifndef,那么结果会反过来
#include<stdio.h>
int main(void){
#if defined(HP)//如果定义了布尔值会为1
    printf("1\n");
#elif !defined(WJ)
    printf("2\n");
#else
    printf("3\n");
#endif
    return 0;
}
//定义了哪个宏就会输出哪个

4、Makefile的使用

1.Make是自动编译管理器,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少
    编译的工作量,同时,它通过读入Makefile来执行大量的编译工作
 2.make工具的作用
    当项目中包含多个c文件,但只对其中1个文件进行了修改,gcc编译会将所有的文件从头编译一      遍,这样效率会非常低,所以通过make工具,只对修改过的文件进行编译,这样大大减少了编      译时间,提高编译效率  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值