当前位置: 首页 > ops >正文

初学c语言22(编译和链接)

一.翻译环境和运行环境

在ANSIC的任何一种实现中存在俩个不同的环境,分别为翻译环境和运行环境,翻译环境中源代码转化为可执行的机器指令(二进制指令),执行环境执行代码

1.翻译环境

翻译环境分为编译和链接,而编译又分为预处理、编译、汇编三个过程

二.预处理详解

预处理阶段主要处理的是源文件#开始的预编译指令,规则如下:

• 将所有的 #define 删除,并展开所有的宏定义。

• 处理所有的条件编译指令,如: #if 、 #ifdef 、 #elif 、 #else 、 #endif 。

• 处理#include预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进 ⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。

• 删除所有的注释

• 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。

• 保留所有的 #pragma 的编译器指令,编译器后续会使⽤。

1.预定义符号

#include <stdio.h>int main()
{printf("%s\n", __FILE__); //进行编译的源文件printf("%d\n", __LINE__); //文件当前的行号printf("%s\n", __DATE__); //文件编译的日期printf("%s\n", __TIME__); //文件编译的时间return 0;
}

结果:

2.#define定义常量

语法:

3.#define定义宏

语法:

举例:

但这个代码存在问题:

所以得这么写:

4.宏和函数的对比

5.#运算符

功能:将一个参数转化为字符串字面量(仅能出现在带参数宏的替换链列表里)

补充:

举例:

6.##运算符

功能:将位于俩边的合成一个符号

举例:

7.#undef

功能:移除一个宏定义(与#define 对偶)

8.条件编译

功能:可以选择性编译

 1.#if  
常量表达式
//... 为真就执行编译#endif//
常量表达式由预处理器求值。如:
#define __DEBUG__ 1#if __DEBUG__//..#endif2.
多个分⽀的条件编译
#if 
常量表达式
//...#elif 
常量表达式
//...#else//...3.
判断是否被定义
#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.
嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif

9.头文件的包含

分为本地文件包含(如之前扫雷游戏中#include "game.h")和  库文件包含(如#include <stdio.h>)

查找策略:先在源⽂件所在⽬录下查找,如果该头⽂件未找到,编译器就像查找库函数头⽂件⼀样在标准位置查 找头⽂件。 如果找不到就提⽰编译错误

10.嵌套文件包含

由于头文件可能重复包含,如果工程较大会导致预处理阶段插入大量重复代码,编译压力大

有如下解决方案:

1.在每个头文件开头加上如下代码:

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

或:

#pragma once

http://www.xdnf.cn/news/10406.html

相关文章:

  • 基于谷歌ADK的智能客服系统简介
  • 家政维修平台实战11搭建服务规格
  • 力扣题解106:从中序与后序遍历序列构造二叉树
  • esp-idf ubuntu环境配置
  • C++多重继承详解与实战解析
  • C++ —— STL容器——string类
  • xdma 驱动测试与分析
  • Launcher3体系化之路
  • Spring Boot对一些技术框架进行了统一版本号管理
  • vue3常用组件有哪些
  • 【STM32F1标准库】理论——外部中断
  • YOLOv5 环境配置指南
  • 高速串行通信解惑说明
  • 数据结构-排序-排序的七种算法(2)
  • Java流【全】
  • vscode + cmake + ninja+ gcc 搭建MCU开发环境
  • 6v6-导航收录:2025年网站自动引流终极方案 - 提升SEO排名新策略
  • PCIe—TS1/TS2 之Polling.Active(一)
  • Java异步编程:CompletionStage接口详解
  • rv1126b sdk移植
  • QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”
  • 深入理解设计模式之观察者模式
  • 59、干系人概述
  • Windows系统时间怎么设置
  • Centos7 中Gunicorn的安装配置
  • Docker 在云环境中的部署:AWS/ECS 与 Azure/AKS 的实践对比
  • 自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?
  • opencv使用经典bug
  • OD 算法题 B卷【文件目录大小】
  • 基于ssm+mysql的大创项目申报管理系统(含LW+PPT+源码+系统演示视频+安装说明)