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

C语言的编译(预处理操作)+链接

目录

       翻译环境和执行环境

       预定义符号

       #define定义标识符

       续行符\

        #define定义宏

       再说一下,#define其实就是替换

       #和##

        宏和函数的对比

        命名约定

       #undef

       命令行定义

        条件编译

       文件包含

        避免头文件重复引用,否则会增加代码长度


 

 

       翻译环境和执行环境

在C中存在两个不同的环境,分别是翻译环境和执行环境,翻译环境又包括编译和链接两种,然后生成目标文件和可执行文件。编译本身也分为几个阶段:预处理选项、编译选项、汇编。

       预定义符号

__FILE__ 这是文件路径

__LINE__ 这是所在行号

__DATE__

__TIME__

__STDC__

Printf(“%s”,__FILE);

       #define定义标识符

#define MAX 100

       续行符\

Printf(“%s\t%d\

\t%f\n”,”张三\

”,34,3.5)

        #define定义宏

#define SQUARE(X) X*X

Printf(“%d”,SQUARE(5));

       再说一下,#define其实就是替换

       #和##

#ch等于”ch”,字符串

ch等于c##h,合并两个

#define PRINT(X,Y) printf("this value of " #Y " is " X"\n",Y)//Y当成了字符串,X当成了"%d",然后把Y的值给了Xint main()
{PRINT("%d", 3 + 4);PRINT("%d", 4 + 8);return 0;
}

 

        宏和函数的对比

属性#define定义宏函数
代码长度每次使用时,宏代码都会被插入到程序中,除了非常小的宏之外,程序的长度会大幅度增长函数代码只出现于一个地方,每次使用这个函数时,都调用那个地方的同一份代码
执行速度更快存在函数的调用和返回的额外开销,所以相对慢一些
操作符优先级宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多些括号函数参数只在函数调用的时候求值一次,它的结果值传递给函数,表达式的求值结果更容易预测
带有副作用的参数参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候求值一次,结果更容易控制
参数类型宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何参数类型函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数
调试宏是不方便调试函数是可以逐语句调试
递归宏不能递归函数可以递归

 

        命名约定

宏名全大写,函数名不全大写

       #undef

用于移除一个宏定义

#undef NAME

       命令行定义

Int a[MAX]

Int i = 0;

For(i=0;i<MAX;i++)

{

       A[i] = i+1;

}

For(i=0;i<MAX;i++)

{

       Printf(“%d\n”,a[i]);

}

在命令行里为MAX给值

        条件编译

#define __DEBUG__  定义

#ifdef __DEBUG__  如果定义

#ifnde __DEBUG__ 如果不定义

#endif 用来结束

只是判断它是不是被定义,如果不满足条件,在预处理阶段会消失。

       文件包含

#include ”Pet.h” 本地文件包含,如果找不到就去库文件找

#include <Pet.h> 直接去库文件找

        避免头文件重复引用,否则会增加代码长度

在每一个头文件前面加上#pragma once,其他源文件如果引用这个头文件两三个,都只会得到一个。

http://www.lryc.cn/news/415613.html

相关文章:

  • FFmpeg实战 - 解复用与解码
  • 8.5作业
  • 【问题】C++:有哪些类型的智能指针,区别?
  • Go-反射
  • 【深度学习】DeepSpeed,ZeRO 数据并行的三个阶段是什么?
  • 代码随想录算法训练营第三十六天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
  • Pandas行列变换指南:数据重塑的艺术
  • 1.MySQL面试题之innodb如何解决幻读
  • Nginx中$http_host、$host、$proxy_host的区别
  • C# Unity 面向对象补全计划 七大原则 之 里氏替换(LSP) 难度:☆☆☆ 总结:子类可以当父类用,牛马是马,骡马也是马
  • PXE批量安装操作系统
  • float32转float16、snorm/sunorm8/16 学习及实现
  • 小型养猫空气净化器怎么选?小型养猫空气净化器产品评测
  • 数学建模--二分法
  • 如何使用 Puppeteer 绕过 Akamai
  • 【硬件知识】车规级开发等级——AEQ-100和ISO26262标准
  • Qt | QStackedBarSeries(堆叠条形图)+QPercentBarSeries(堆叠百分比条形图)
  • C++——多态经典案例(一)组装电脑
  • 从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案
  • Windows下,已知程序PID,取得其窗口句柄HWND
  • Java获取exe文件详细信息:产品名称,产品版本等
  • ORB-SLAM2运行环境搭建
  • Nginx高频核心面试题2
  • 全面提升PDF编辑效率,2024年五大顶级PDF编辑器推荐!
  • 代码随想录算法训练营第二十天|235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
  • 视频美颜SDK与直播美颜插件在实时视频中的应用
  • 【Linux】yum(工具篇)
  • 3GPP入门
  • FFmpeg内存对齐简述
  • 手机号码归属地查询接口如何对接?(一)