首页 > 其他分享 >C 语言编译预处理

C 语言编译预处理

时间:2023-01-02 11:33:11浏览次数:38  
标签:语言 定义 编译 PI 预处理 3.1415926 define

一、编译预处理概念

1、编译预处理不是 C 语言本身的内容,是 C 编译系统提供的功能。在通常的编译之前,编译系统要预先对这些命令进行处理,之后才对 C 程序进行编译,生成目标代码。

特别注意:所有预处理命令均以 # 开头,末尾不加分号。

2、以下是三种预处理命令:

宏定义

#define PI 3.1415926

文件包含

#include <stdio.h>
#include "c_file1.c"

条件编译

#ifdef 标识符
	// TODO1
#else
	// TODO2
#endif

二、宏定义 & 文件包含 & 条件编译

1、宏定义

宏定义可以分为两种:1、不带参数的宏定义;2、带参数的宏定义。二者都是简单的字符串替换。

① 不带参数的宏定义

// 不带参数的宏定义方式
#define 标识符 一串字符

// 例如(以下宏定义中 PI 即为“宏名”):
#define PI 3.1415926

// 宏定义的作用:用 “标识符” 后的 “一串字符” 来替换程序中的 “标识符”
// 例如:#define PI 3.1415926
// 表示用 3.1415926 替换程序中的所有标识符 PI

// 参考代码
#include <stdio.h>
#define PI 3.1415926

int main(int argc, const char * argv[]) {
    // r 表示半径;l 表示周长; s 表示面积
    double r = 6, l = 0, s = 0;
    l = 2 * PI * r; // 计算周长
    s = PI * r * r; // 计算面积
    
    printf("周长 = %.2f;  面积 = %.2f\n", l, s);
    
    // 特别提醒:双引号中的 PI 不会被替换为 3.1415926
    printf("PI = %.7f\n", PI);
    
    return 0;
}

// 以上代码运行结果如下:
周长 = 37.70;  面积 = 113.10
PI = 3.1415926

*** 在预处理时,先做如下替换,然后才开始编译:***

l = 2 * PI * r; 会被替换成 l = 2 * 3.1415926 * r;
s = PI * r * r; 会被替换成 s = 3.1415926 * r * r;

*** 特别提醒:***

1> 宏名前后应有空格

2> 宏定义是用宏名代替一个字符序列,只是一种简单的替换,不进行正确性检查。

例如:

#define PI = 3.14abc15926
s = PI * r * r;
// 以上代码在预编译时只做替换操作,不会出错。在编译时才会报错。因为 3.14abc15926 不是合法的数字。

*** 易错提醒:***

#define PI 2 + 1.1415926
s = PI * r * r;

// s = PI * r * r; 展开后形式是:s = 2 + 1.1415926 * r * r; 由于运算符优先级问题此时计算的结果 s 是错误的。

// 应该将宏定义改为:
#define PI (2 + 1.1415926) 
// 此时,s = PI * r * r; 展开后形式是:s = (2 + 1.1415926) * r * r; 计算结果正确

② 带参数的宏定义

标签:语言,定义,编译,PI,预处理,3.1415926,define
From: https://www.cnblogs.com/zxhoo/p/17019635.html

相关文章

  • C语言学生成绩管理程序[2023-01-02]
    C语言学生成绩管理程序[2023-01-02]题目一、学生成绩管理程序(学号后三位139-390的选做)任务:利用C语言中相关知识(包括文件,结构体数组等)设计学生成绩管理程序,要求如下:任意......
  • 计算机编程基础-编程语言,计算机基础
    计算机编程基础目录计算机编程基础1.编程语言1.1编程1.2计算机语言1.3编程语言1.4翻译器2.计算机基础2.1计算机组成2.1计算机组成2.2数据存储2.3数据存储单位2......
  • C语言中的单目运算符
    !逻辑反操作 - 负值+ 正值&取地址sizeof操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置--、后置--++前置++、后置++*  间接访问操作符(解引......
  • Go语言微服务框架go-micro(入门)
    Micro用于构建和管理分布式系统,是一个工具集,其中go-micro框架是对分布式系统的高度抽象,提供分布式系统开发的核心库,可插拔的架构,按需使用简单示例编写protobuf文件:synt......
  • C语言:打印乘法口诀表。
    #include<stdio.h>intmain(){inti=0;for(i=1;i<=9;i++){intj=1;for(j=1;j<=i;j++){printf("%d*%d=%-2d",i,j,i*j); } printf("\n"......
  • 狂神说Go语言—并发编程
    聊聊进程、线程、协程多线程上方左图所示:在主线程中为main方法左图的右边为test方法,在main方法中调用test方法,mian方法执行就会先去执行test方法,执行完后再回到main......
  • C语言--函数2--递归2
    递归--判断一个一维数组是否递增#include<stdio.h>#defineN5//判断一个一维数组是否递增/*Judge_dz:判断一个一维数组是否递增@a:一维数组名@n:元素个数返回值:无*......
  • aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译
    ▶ 简介aardio可以非常方便地调用.NET(不需要任何复杂的步骤)。.NET在aardio中很好用,系统自带.NET组件以及各种开源.NET组件在aardio用户中也很受欢迎。aardio......
  • sccache 基于rust 类似ccache 的编译cache 工具
    sccache类似ccache的编译cache工具,支持基于本地磁盘,或者云对象存储特性基于c/c++,rust编译支持增量编译rust集成使用可以通过定义build.rustc-wrapper,基于......
  • R语言在线地图神器:Leaflet for R包(三) 符号标记
    四、标记点标记在地图符号化的时候,是最常用的功能之一,一般来说,带有经纬度坐标的点信息,在地图上标志的位置,都会通过一个标记物来实现,很多时候把这个东东称之为“图钉”是非......