vim helloword.c
#include<stdio.h>
#definr R 10 //R就是宏,结尾不用分号隔开。
int main()
{
int a = R;
printf("%d\n",a);
printf("helloworld\n");
return 0 ;
}
编译程序:gcc helloworld.c
查看运行效果:./a.out
结果为:a=10
helloworld
查看预处理之后的文件:gcc -0 helloworld.i helloworld.c -e
回车
gcc -o helloworld.i helloworld.c -E
vi helloworld.i
宏不考虑语法
宏:反复使用的常量,数组buffer大小;为了便于修改,定义成宏
define 宏的声明不需要会分号
宏定义命令符 define 例:#define R 10
编译器预处理时将宏定义视为字符串并进行替换,
宏 不考虑C的语法,只是单纯的替换
#define M Macro
对比.c与.i文件的区别:1、首先都是c的语法 2、.c文件开头的#include<stdio.h>变成了一堆代码:预处理首先展开了头文件 3、预处理进行了宏替换(用到宏的地方 都被替换成宏值,编译器是把宏值当做字符串)
如何申明一个宏: #define 宏名(标识符规范) 宏值(注意编译器把宏值当做字符串)
截图 :在预处理过程的宏替换
宏一般用途:为了便于修改代码中反复使用到的常量 数组的buffer
定义宏:
#define ...
eg.#define R 10
宏定义与预处理同时发生在第一阶段,I文件中将C文件中引用宏的地方都替换成其表达式。(但只是将表达式的字符串移动到引用宏的地方。)
eg.C文件中:#define R 10 int a=R;
I文件中:int a=10;
预处理第二件事:宏替换
#define 生成宏 R 宏的名字 10 宏的内容(作用效果,从本行开始)
此时视10为字符(单纯的字符串替换,不考虑语法的问题)
2-1:
linux c 预处理:
编译的四个步骤:.c文件—>.i文件(预处理)->.s文件(编译)->.o文件(汇编)->可执行文件(链接)
gcc -o helloworld.i helloworld.c -E生成一个.i文件,只进行预处理
.c和.i文件都是C的语法。.i展开了头文件和进行宏替换(宏定义)
2-2:
宏定义符:#define
c语言常量分为直接常量和符号常量:
#define 标识符 常量值(没有分号)
宏的本质是在预处理阶段发生的单纯的字符串替换(宏替换);
在预处理阶段,宏不考虑 C的语法。例如:
#define n int main(
n){} == int main(){} //这样写是可以的
而宏的作用通常是用于替换一些比常用的变量或名字:u8、u16之类的
宏#define 标识符 字符串(无;)
宏不遵循C的语法,仅是字符串的替换。
用法:
定义常量和数组buffer
传递参数,相当于函数功能。
#define R 10(不要分号)
10作为一个字符串替换掉R
#define M int main(也可以执行,预处理不考虑语法
反复使用的常量,数组buffer(数组大小),便与修改
1.宏替换也出现在预处理中,且不管C的语法,单纯为字符串替换 2.声明宏用#define 3.宏的作用为声明反复出现的常量及数组的buffer {e.g #define R 10(注意没有分号!) int a = R; int a[M], B[M]; 或者#define R int main( ,然后输入M)也行}
1.reventon@reventon-virtual-machine:~$ vim helloworld.c
(新建helloworld.c源文件)
2.编码
3.编译: gcc helloworld.c(生成一可执行文件)
执行所生成的文件 ./a.out
会输出helloworld
编译的四个步骤:
.c文件 .i文件 .s文件 .o文件 (可执行文件)
预处理 编译 汇编 链接
gcc -o helloworld.i helloworld.c -E
(生成.i文件) ‖只让gcc进行预处理
回车,vi helloworld.i (看helloworld.i文件)
有大量代码,:$ (直接跳到代码底端)
底端是main函数,
上面的大量是#include <stadio.h>的展开
所以预处理的第一件事是展开头文件
第二件是宏替换
宏不考虑语法,随便替换
#define M int main(
M) //即int main(
宏的本质:宏替换就是指在预处理阶段的,单纯的字符串的替换。
gcc -o 生成文件.i 被执行文件.c -E(只进行预处理)
预处理:展开头文件、宏替换
宏是不考虑C的语法,只是单纯的字符串替换
20161013 LinuxC语言结构体 2-1 预处理 gcc -o helloworld.i helloworld.c 执行过程如下: .c文件 -> (预处理).i文件 ->(编译) .s文件 ->(汇编).o文件 ->(链接)可执行文件 gcc -o helloworld.i helloworld.c -E (只进行预处理,生成.i文件 ) 预处理: 1.展开头文件(如 展开 include <stdio.h>的内容) 2.宏替换:本质就是发生在预处理的单纯的字符串替换 注释 宏定义: 就是常量,数组buffer。不以分号结尾 #define R 10(此处 10为字符串)
预处理阶段宏定义不考虑C的语法
宏替换在预处理阶段执行,不考虑C的语法