文章目录
前言
这里写一下有关程序环境和预处理的内容
一、程序环境
- 翻译环境:在这个环境中源代码被转换为可执行的机器指令。
- 执行环境:它用于实际执行代码
二、编译
1.预编译
- 1.注释的删除
- 2.#include 头文件的包含
- 3…#define 符号的替换
- 4.所有的预处理指令都是在预处理阶段进行处理
2.编译
- 1.把c语言代码翻译成了汇编指令
- 2.语法分析
- 3.语义分析
- 4.词法分析
- 5.符号汇总
3.汇编
- 把汇编代码翻译成二进制的指令
- 形成符号表
三、预定义符号
-
__FILE__ //进行编译的源文件
-
__LINE__ //文件当前的行号
-
__DATE__ //文件被编译的日期
-
__TIME__ //文件被编译的时间
-
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
- 作用代码演示:
#include <stdio.h>
int main()
{
//都是预编译阶段处理的预定义符号
printf("%s\n", __FILE__);//文件名
printf("%d\n", __LINE__);//这个代码在第几行
printf("%s\n", __DATE__);//日期
printf("%s\n", __TIME__);//时间
//printf("%s\n", __STDC__);//VS不支持ANSIC
return 0;
}
四、#define
#define 定义标识符
#include <stdio.h>
#define W 7
#define Y "ABC"
#define Z for(;;)
int main()
{
printf("%d\n", W);
printf("%d\n", Y);
//Z
//{
// printf("hehe\n");
//}
return 0;
}
#define 宏定义
#include <stdio.h>
//#define 定义宏 不能递归
#define SQUARE(X) X*X
//#define SQUARE(X) ((X)*(X)) 尽量写成这样
int main()
{
int a = 3;
int r = SQUARE(a);
int r = SQUARE(a+2);
printf("r=%d\n", r);
return 0;
}
#和##
宏和函数对比
- 宏不方便调试
- 宏不够严谨
- 一般简单的算法用宏定义
- 需要重复多次且内容大则用函数
命名约定
- 宏名全部大写
- 函数名 不要全部大写
#undef
条件编译
文件包含
- #include “xxx.h”
- 先在xxx.c文件的当前文件目录下找xxx.h,找不到再去库目录里面找,
- 在找不到就报错
- #include <xxx.h>
- 直接去不标准库目录去找
- 找不到就报错
- 提示:这里对文章进行总结:
- 防止头文件重复多次包含(引用)
-
-
#if xxx_h
-
#define xxx_h
-
int Add(int x, int y)
-
#endif
-
- #pragma once
- int Add(int x, int y)
总结
- 真没啥好说的
- 目前学的还有限只理解这些
- 写一篇博客强化记忆一下