服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言简明讲解预编译的使用

C语言简明讲解预编译的使用

2022-11-21 15:30_雪菜肉丝面_ C/C++

在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境

小复习

预处理,预编译是编译的第一步。

会有三件基本的事情发生:

  • 引入#include
  • 去除注释
  • 修改#define

 

1、内置符号

这些符号都可以直接使用:

__FILE__ 点c文件全名
__LINE__ 当前行号
__DATE__ 编译日期
__TIME__ 编译时间

举例:

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

效果:

C语言简明讲解预编译的使用

 

2、自定义符号

#define 名 值

不带分号。预编译阶段,所有名字会被值替换。

举例:给printf取个别名。

#include<stdio.h>
#define say printf
int main() {
	say("你好,世界!\n");
	return 0;
}

效果:

C语言简明讲解预编译的使用

举例:自定义一个死循环符号。

#include<stdio.h>
#define loop while(1)
int main() {
	int i = 0;
	loop{
		if (i > 1000) {
			break;
		}
		else {
			printf("你好,世界!\t%d\n",i);
			i++;
		}
	}
	return 0;
}

效果:

C语言简明讲解预编译的使用

 

3、自定义宏

和自定义符合差不多。

相当于函数,只不过在预编译的阶段就会执行。

然后替换掉。

#define 名 ( 参数列表 ) 表达式

举例:输出字符串。

#include<stdio.h>
#define say(s)printf(s)
int main() {
	say("你好,世界!\n");
	return 0;
}

效果:

C语言简明讲解预编译的使用

替换逻辑:递归。

看参数有没有define,有就套娃。

直到没有,替换自己。

字符串内部的符号会被忽略。

 

4、条件编译

可以用#define定义一个符号,代表是否要执行。

#include<stdio.h>
#define __DEBUG__ 1
int main() {
	if (__DEBUG__) {
		printf("调试模式开启\n");
	}
	else {
		printf("调试模式关闭\n");
	}
	return 0;
}

效果:

C语言简明讲解预编译的使用

同时,可以让这段代码直接跳过编译。

#include<stdio.h>
#define __DEBUG__ 1
int main() {
#if __DEBUG__
	printf("调试模式开启\n");
#endif
	return 0;
}

这种写法也有配套的选择分支。

#include<stdio.h>
#define __DEBUG__ 0
#define __WARN__ 1
int main() {
#if __DEBUG__
	printf("调试模式\n");
#elif __WARN__
	printf("警告模式\n");
#else
	printf("正常模式\n");
#endif
	return 0;
}

效果:

C语言简明讲解预编译的使用

到此这篇关于C语言简明讲解预编译的使用的文章就介绍到这了,更多相关C语言预编译内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_37284843/article/details/124522408

延伸 · 阅读

精彩推荐
  • C/C++c++ 解决无法打印uint8_t 类型变量的问题

    c++ 解决无法打印uint8_t 类型变量的问题

    这篇文章主要介绍了c++ 解决无法打印uint8_t 类型变量的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    feidaji4532021-10-11
  • C/C++C++简单五子棋的AI设计实现

    C++简单五子棋的AI设计实现

    这篇文章主要为大家详细介绍了C++简单五子棋的AI设计实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    black_kyatu12292021-07-02
  • C/C++C++中指针函数与函数指针的使用

    C++中指针函数与函数指针的使用

    今天小编就为大家分享一篇关于C++中指针函数与函数指针的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    蜗牛2019422021-07-15
  • C/C++基于堆的基本操作的介绍

    基于堆的基本操作的介绍

    本篇文章对堆的基本操作进行了详细的分析介绍。需要的朋友参考下...

    C++教程网4972020-11-26
  • C/C++C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解

    这篇文章主要介绍了C++ 中const对象与const成员函数的实例详解的相关资料,希望通过本文能让大家彻底掌握该如何使用,需要的朋友可以参考下...

    liuzhanchen19876772021-05-31
  • C/C++vscode搭建STM32开发环境的详细过程

    vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    顶点元8802021-11-03
  • C/C++C++哈希表之线性探测法实现详解

    C++哈希表之线性探测法实现详解

    线性探测法的优点:只要散列表未满,总能找到一个不冲突的散列地址;缺点:每个产生冲突的记录被散列到离冲突最近的空地址上,从而又增加了更多的...

    liufeng202311102022-11-21
  • C/C++C++string容器基本概念详解

    C++string容器基本概念详解

    c++相比c的一个好处就是实现了很多的容器和泛型算法,使得程序员的工作得到了很大的简化,本文重点给大家介绍C++string容器基本概念讲解,需要的朋友参...

    鬼才fjz9882021-11-19