自学内容网 自学内容网

编译和连接,预处理详情

在ANSI C的任何⼀种实现中,存在两个不同的环境:

翻译环境和运行环境
在这里插入图片描述
(下面主要介绍翻译环境)
在这里插入图片描述
(这个图还比较生动)

预处理详情

1.预定义符号
在这里插入图片描述

printf("file:%s line:%d\n", __FILE__, __LINE__);

2.#define定义常量
基本语法:
#define name stuff
3. #define定义宏
宏的申明方式:
#define name( parament-list ) stuff
注意:

  1. 定义宏时一定不要吝啬括号!
    不然就会因为优先级的原因得不到预期结果。
  2. 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归
  3. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

4.宏和函数的对比
在这里插入图片描述
5.#undef这条指令用于移除⼀个宏定义
6.条件编译
(调试性的代码,删除可惜,保留⼜碍事,所以我们可以选择性的编译)
常见的:

1.
#if 常量表达式
 //...
#endif
//常量表达式由预处理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__
 //..
#endif
2.多个分⽀的条件编译
#if 常量表达式
 //...
#elif 常量表达式
 //...
#else
 //...
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.嵌套指令
#if defined(OS_UNIX)
 #ifdef OPTION1
 unix_version_option1();
 #endif
 #ifdef OPTION2
 unix_version_option2();
 #endif
#elif defined(OS_MSDOS)
 #ifdef OPTION2
 msdos_version_option2();
 #endif
#endif

(如果不符合则在预处理阶段不会展示)

7.头文件包含
1.用" "

#include "filename"

先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件⼀样在标准位置查找头文件。
2.用<>

#include <filename.h>

查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。

8.嵌套文件包含
在这里插入图片描述
像这样,"test.h"被包含5次,那就实际被编译5次,如果重复包含,对编译的压力就比较大。
如何解决头文件被重复引入的问题?答案:条件编译
1.每个头文件的开头这样写:

#ifndef __TEST_H__
#define __TEST_H__
//头⽂件的内容
#endif //__TEST_H__

(第一次还没定义,所以符合条件进入下面步骤:先定义;
到第二次引用头文件则已经定义了所以不会执行以后的操作。
总之头文件只会引用一次。)
2.或者这样:

 #pragma once

原文地址:https://blog.csdn.net/Danika_Liu/article/details/136043876

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!