编译流程
c——>翻译环境(编译(编译器),链接(连接器))——>运行环境——>exe
编译包括:一、预编译(删除注释,替换define)
二、编译(把c代码编译成汇编语言)
三、汇编
Linux gcc-E test.c
链接包括:一、合并段表
二、符号表的合并和符号表的重定位
预编译详解
预定义符号
原先定义好的:__FILE__ 文件元文件名称
__LINE__ 行
__DATE__ 日期
__TIME__ 时间
#define 预处理指令
# 开头的都叫预处理命令
例:#define MAX 100
#define STR "haha"
#define reg register 把关键字reginter义为reg
#define do_forever for(;;)
#define 定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或宏定义(define macro)
声明方式:#define name(parement-list) stuff其中的parement-list是一个由逗号隔开的符号表它可能出现在stuff中。例:
#define SQUARE(X) X*X
int main()
{
int ret = SQUARE(5);
return 0;
}
#和##
使用#:把一个宏定义参数变成对应的字符串
##可以把位于它两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符
#define CAT(X,Y) X##Y//把##两边X,Y合成一个符号
带副作用的宏参数
切记:宏的参数是替换进去再在宏中使用
宏和函数对比
宏不能调试
宏可以传类型,函数不行
命名约定
宏名全部大写,函数名不大写
#undef 移除一个宏定义
用法#undef NAME
命名行定义
#include<stdio.h>
#define DEBUG
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int i = 0;
for (i = 0; i < 10; i++)
{
arr[i] = 0;
#ifdef DEBUG//如果前边不定义DEBUG则不执行
printf("%d", arr[i]);
#endif
}
return 0;
}
条件编译指令
1.#if 常量表达式//常量表达式为真则执行
//.....
#endif
//常量表达式由预处理器求值
2.多分支的条件编译
#if 常量表达式
//......
#elif 常量表达式
//......
#else
//......
#endif
3.判断是否被定义
#if defined(symbol)//如果定义过symbol则执行
4.嵌套指令
文件包含
本地文件:#include "filename.h"
库文件:#include <filename.h>
防止同一头文件嵌套重复使用
第一种方法:
#ifndef __TEST_H_
#define __TEST_H_
int add(int x,int y)
#endif
第二种方法:
#pragma once
**********************************************************
致敬:比特鹏哥
**********************************************************