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

C语言(C预编译指令)

目录

1.undef

2.条件编译#ifdef,#else和#endif

3.#ifndef

4.#if和#elif

5.预定义宏

6.#line和#error

7.#pragma

1.undef

#undef指令用于取消已定义的#define指令

#define LIMIT 400

#undef LIMIT

如果想使用一个名称但又不确定之前是否已经用过,为了安全起见,可以使用undef

2.条件编译#ifdef,#else和#endif

#ifdef MAVIS   //如果有用#define 定义MAVIS,则执行一下命令

#include "horse.h" 

#define STABLES 5

#else       //如果没有用#define 定义MAVIS,则执行一下命令

#include "cow.h"

#define STABLES 15

#endif   //结束

#ifdef指令说明,如果预处理器已定义了后面的标识符,则执行#else或#endif指令之前的所有指令并编译C代码。如果预处理器未定义标识符,且有#else指令,则执行#else和#endif指令之间的所有代码

这里逻辑和if else的概念很像,但它们的区别在于预处理器指令不识别用于标记块的花括号,因此它使用#else和#endif来标识指令块

3.#ifndef

#ifndef指令与#ifdef指令用法一样,也可以配合#else和#endif使用,不同的是#ifndef指令判断后面的标识符是否是未定义的

通常,包含头文件时,其中的文件可能包含了相同宏定义。#ifndef指令可以防止相同的宏被重复定义。在首次定义一个宏的头文件中使用#ifndef指令激活定义,随后在其他头文件中的定义都被忽略

#ifndef指令还通常用于防止多次包含一个文件。

#ifndef THINGS_H_

#define THINGS_H_

#endif

假设该文件被多次包含,当预处理器首次发现该文件被包含时,THINGS_H_是未定义的,所以定义了THINGS_H_,并接着处理该文件的其他部分。在预处理器第二次发现该文件被包含的时候,THINGS_H_是已定义的,所以预处理器会跳过该文件的其他部分

#ifndef THINGS_H_

#define THINGS_H_

Sturct … 头文件其他部分

#endif

4.#if和#elif

#if后面跟整型常量表达式,如果表达式为非零,则表达式为真。#if #else和if else用法相似

#if SYS == 1

#include "ibmpc.h"

#elif SYS == 2

#include "vax.h"

#elif defined(IBMPC)

#include "mac.h"  ///这里defined是一个预处理运算符,如果它的参数使用#defined定义过多,返回1,否则返回0

#else

#include "general.h"

#endif

5.预定义宏

_DATE_

预处理的日期(‘Mmm dd yyyy’字符串字面量)

_FILE_

表示当前源代码文件名的字符串字面量

_LINE_

表示当前源代码文件中行号的整型常量

_STDC

设置为1,表示实现遵循C标准

_STDC_HOSTED

本机环境设置为1,否则设置为0

_STDC_VERSION

支持C99标准,设置为199901L;支持C11标准,设置为201112L

_TIME_

翻译代码的时间,格式为“hh:mm:ss”

_func_

展开为一个代表函数名的字符串

6.#line和#error

#line指令重置#_LINE_和_FILE_红报告的行号和文件名

#line 10 "cool.c"   //把行号重置为10,把文件名重置为cool.c

#error指令让预处理器发出一条错误消息,把消息包含指令中的文本

#error Not C11

7.#pragma

#pragma把编译器指令放入源代码中。

#pragma c9x on//让编译器支持C9X

C99还提供——Pragma预处理器运算符,该运算符把字符串转换成普通的编译指示

_Pragma("c9x on") 相当于 #pragma c9x on


好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

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

相关文章:

  • JMeter 接口测试/并发测试/性能测试
  • 大家心心念念的RocketMQ5.x入门手册来喽
  • (考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述
  • B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)
  • 【Node.js实战】一文带你开发博客项目之Koa2重构(实现session、开发路由、联调、日志)
  • 第一部分:简单句——第二章:简单句的补充
  • Spring Security简介
  • Hadoop安装 --- 简易安装Hadoop
  • 俞军产品方法论,消化吸收,要点整理
  • spring注解的开端(@Component替代bean标签的使用)
  • Matlab傅里叶谱方法求解一维波动方程
  • py3中 collections.Counter()函数典型例题
  • Linux部署达梦数据库超详细教程
  • ctfshow 每周大挑战 极限命令执行
  • 使用vue3,vite,less,flask,python从零开始学习硅谷外卖(16-40集)
  • 坚持就是胜利
  • 代码中出现转置 pose (c2w,外参矩阵) 或者转置 intrinsic (内参)矩阵的原因
  • 2023 年腾讯云服务器配置价格表出炉(2核2G/2核4G/4核8G/8核16G、16核32G)
  • 相机出图画面一半清晰,一半模糊的原因是什么?
  • Rust学习入门--【4】Rust 输出到命令行
  • Vector刷写方案—vFlash工具介绍
  • 【阶段总结】《非结构化信息分析应用与实践(筹)》
  • 七大设计原则之迪米特法则应用
  • curl命令用法精简整理
  • Fluent Python 笔记 第 5 章 一等函数
  • 卡尔曼滤波器与DSP实现
  • 引入QQ邮箱发送验证码进行安全校验
  • 【c++】数组
  • 线程池的简单实现:Java线程池初学者必读指南
  • 【C#】[带格式的字符串] 复合格式设置字符串与使用 $ 的字符串内插 | 如何格式化输出字符串