C的预编译指令

预编译指令

  • #include
    • 对于形如 ``#include "demo.h"`` 的指令:
    • 对于形如 ``#include <demo.h>`` 的指令:
  • #define
    • 简单宏替换
    • 带参数的宏
  • #ifdef, #ifndef, #if
  • #pragma
  • #error
  • #line

在C语言中,预编译指令用于在编译之前进行代码的预处理。

# 预编译
gcc -Wall -E hello.c -o hello.i 

#include

用于包含头文件

对于形如 #include "demo.h" 的指令:

  • step1: 编译器首先在当前目录中查找demo.h
  • step2: 未找到,编译器会检查通过-I选项指定的目录
  • step3:仍然未找到,编译器会继续在/usr/include/usr/local/include等标准系统路径中查找。

对于形如 #include <demo.h> 的指令:

编译器会跳过当前目录

  • step1:直接从-I选项指定的目录
  • step2:未找到,在标准系统路径下开始查找
    如果在所有指定的路径中都没有找到头文件,编译器会报错,指出无法打开包含文件。

#define

定义宏

本质就是预处理时,进行文本的匹配替换

简单宏替换

#define PI 3.14159
#include <stdio.h>
int main() {double radius = 5.0;double area = PI * radius * radius;printf("The area of the circle is: %f\\n", area);return 0;
}

带参数的宏

这种形式的宏类似于函数,可以接受参数并进行替换。

#define MACRO_NAME(PARAM1, PARAM2, ...)  replacement_text
#include <stdio.h>
#define PRINT_STRING(str) printf("%s\n", str)
int main() {char * msg="Hello, World!\n";PRINT_STRING(msg); // 展开为 printf("%s\n", msg);return 0;
}

在宏定义中使用参数的字符串表示,可以使用字符串化操作符 #

#include <stdio.h>
#define PRINT_MACRO(str) printf("The macro argument is str : %s\n", #str)int main() {PRINT_MACRO(Hello World); // 展开为printf("The macro argument is str : %s\n", "Hello World");return 0;
}

#ifdef, #ifndef, #if

进行条件编译

#ifdef#ifndef 仅检查一个宏是否已经定义,而不考虑宏的值
#if 可以检查任何常量表达式,后面跟宏的时候需要考虑宏的值。
常和#elif#else#endif结合使用

#ifdef MY_MACRO
// 如果 MY_MACRO 被定义,执行这里的代码
#elif defined(OTHER_MACRO)
// 如果 MY_MACRO 未被定义,但 OTHER_MACRO 被定义,执行这里的代码
#else
// 如果 MY_MACRO 和 OTHER_MACRO 都未被定义,执行这里的代码
#endif
#define FEATURE_A 1
#define FEATURE_B 0#if FEATURE_A && !FEATURE_B
// 如果 FEATURE_A 被定义并且其值不为零,且 FEATURE_B 未定义或其值为零,则编译这段代码
printf("Feature A is enabled, but Feature B is not.\n");
#endif

可以使用#undef取消宏定义

#pragma

向编译器发出特殊指令

#pragma pack 是一个非常有用的指令,用于控制结构体、联合体或类在内存中的对齐方式。通过调整对齐方式,可以优化内存使用,特别是在需要与硬件设备或特定协议进行交互时。

#pragma pack(push, 1)  // 设置对齐方式为 1 字节
struct MyStruct {char a;int b;
};
#pragma pack(pop)  // 恢复之前的对齐方式

#error

在编译时生成错误信息。

#line

改变编译器内部的行号和文件名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

etcd磁盘空间故障处理办法

查看etcd状态 etcdctl --cacert=/etc/kubernetes/ssl/ca.crt --cert=/etc/kubernetes/ssl/etcd_server.crt --key=/etc/kubernetes/ssl/etcd_server.key --endpoints=https://10.10.10.31:1159,https://10.10.10.32:1159,https://10.10.10.33:1159 endpoint status --write-…

【系统架构设计 每日一问】二 MySql主从复制延迟可能是什么原因,怎么解决

主从复制的架构设计如下图所示&#xff1a; 同步原理 具体到数据库之间是通过binlog和复制线程操作的&#xff1a; Master的更新事件(update、insert、delete)会按照顺序写入bin-log中。当Slave连接到Master的后,Master机器会为Slave开启&#xff0c;binlog dump线程,该线程…

24、获取NCL色标并将其保存为Excel文件

文章目录 1. 前言2. 代码 1. 前言 在数据可视化的世界里&#xff0c;色彩不仅仅是视觉的盛宴&#xff0c;更是信息的传递者。NCL&#xff08;The NCAR Command Language&#xff09;色标&#xff0c;作为气象和环境科学领域的瑰宝&#xff0c;以其丰富的色彩组合和科学的编排&…

Linux指令ros学习python深度学习bug学习笔记

## 这个文件是关于ros、linux指令&#xff0c;pytorch、python、onnx和相关problem的一些笔记 ### ROS && linux **find: 在当前路径或指定的路径下递归地搜索文件或目录&#xff0c;并可以根据不同的条件进行过滤和匹配。** find -name *.py find /home/dai/bev_…

H3CNE(计算机网络的概述)

1. 计算机网络的概述 1.1 计算机网络的三大基本功能 1. 资源共享 2. 分布式处理与负载均衡 3. 综合信息服务 1.2 计算机网络的三大基本类型 1.3 网络拓扑 定义&#xff1a; 网络设备连接排列的方式 网络拓扑的类型&#xff1a; 总线型拓扑&#xff1a; 所有的设备共享一…

Vue3 --- 路由

路由就是一组key-value的对应关系&#xff1b;多个路由&#xff0c;需要经过路由器的管理。 1. 基本切换效果 安装路由器 npm i vue-router /router/index.ts // import { createRouter, createWebHistory } from vue-router import Home from /components/Home.vue import…

Python面试整理-字典和集合的操作

在Python中,字典(dictionary)和集合(set)是两种非常有用的数据结构,用于存储和操作数据集。字典是一种键值对的集合,而集合是一种只包含唯一元素的集合。下面详细介绍它们的常用操作: 字典操作 创建字典 person = {"name": "Alice",

萝卜快跑爆火的背后,美格智能如何助力无人车商业化?

近期&#xff0c;“订单量超过600万单”等夺人眼球的信息&#xff0c;让无人驾驶出租车“萝卜快跑”从江城武汉爆火出圈&#xff0c;在2024年的炎炎夏日为这座大火炉再添了一把火。热度背后&#xff0c;不少地方主管部门&#xff0c;近期也纷纷针对无人驾驶出租车、无人驾驶运输…

基于术语词典干预的机器翻译挑战赛笔记Task2 #Datawhale AI 夏令营

上回&#xff1a; 基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baseline Datawhale AI 夏令营-CSDN博客文章浏览阅读718次&#xff0c;点赞11次&#xff0c;收藏8次。基于术语词典干预的机器翻译挑战赛笔记Task1 跑通baselinehttps://blog.csdn.net/qq_23311271/article/d…

C++树形结构(2 树的直径)

目录 1.定义&#xff1a; 2.直径的性质&#xff1a; 3.树的直径求解方法&#xff1a; 4.直径端点求解方法&#xff1a; 朴素方法&#xff1a; 优化方法&#xff1a; 5.例题&#xff1a; 6.直径公共点&#xff1a; 7.例题&#xff1a; 8.去掉再加上&#xff1a; 9.例…

最新版kubeadm搭建k8s(已成功搭建)

kubeadm搭建k8s&#xff08;已成功搭建&#xff09; 环境配置 主节点 k8s-master&#xff1a;4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10.16.64.67&#xff09; 从节点 k8s-node1&#xff1a; 4核8G、40GB硬盘、CentOS7.9&#xff08;内网IP&#xff1a;10…

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前&#xff0c;接到同事转来一个bug要排查&#xff0c;症状是代码重构之后某些业务效果不符合预期&#xff0c;由于代码重构人是笔者&#xff0c;于是blame到笔者这边。经过10min左右的排查和尝试后&#xff0c;解决了这个问题&#xff1a;既往逻辑没有改动&#x…

框架使用及下载

Bootstrap5 安装使用 | 菜鸟教程 (runoob.com) https://github.com/twbs/bootstrap/releases/download/v5.1.3/bootstrap-5.1.3-dist.zip&#xff08;下载链接&#xff09; Staticfile CDN&#xff08;html的所有框架合集&#xff09; 直接在w3cschool里面看参考文件进行搜索自…

时间序列问题解题(基于深度学习)(Datawhale AI 夏令营)

一&#xff0c;解题步骤 时间序列问题是指基于时间顺序的数据进行分析和预测的问题。在深度学习的背景下&#xff0c;常用的模型包括循环神经网络&#xff08;RNN&#xff09;&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;和门控循环单元&#xff08;GRU&#xff0…

RHCSA —— 第八节 (编辑器、编辑命令等)

Vi/vim编辑器 vim 编辑器 就是相当于在windows中创建一个记事本&#xff0c;一个word文档里面进行编辑所需要的内容。在linux中编辑文本文件&#xff0c;包括但不限于编辑源代码、配置文件、日志文件等文件内容。 三种模式 这是在编辑器中存在三种模式&#xff1a;命令模式、…

vue中的some方法使用@1@

1.Vue中的some方法是一个数组方法&#xff0c;用于检测数组中是否至少有一个元素满足指定条件。它的用法和作用类似于JavaScript中的Array.prototype.some()方法。 2.在Vue中&#xff0c;使用some方法可以对数组进行条件判断&#xff0c;以确定数组中是否存在满足条件的元素。…

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰&#xff0c;是一个常见的汉字&#xff0c;其拼音为“ch”&#xff0c;音调为第四声。它既可以表示动词&#xff0c;也可以表示形容词或副词&#xff0c;意义广泛&#xff0c;经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…

Huawei、Cisco 路由中 RIP 协议 summary 的用法

华为路由中 RIP summary summary用来使能 RIP 有类聚合&#xff0c;聚合后的路由以使用自然掩码的路由形式发布。undo summary用来取消有类聚合以便在子网之间进行路由&#xff0c;此时&#xff0c;子网的路由信息就会被发布出去。路由聚合降低了路由表中路由信息量。说明 有类…

Deepfake detection【Datawhale AI夏令营】数据增强方法

deepfake detection比赛链接https://www.kaggle.com/competitions/multi-ffdi 训练分类模型判别图片是否为AI生成图片&#xff0c;探究不同数据增强方法对模型表现的影响。 1、数据增强方法 图像分类任务中常见的数据增强方法&#xff1a; &#xff08;1&#xff09; 几何变换…

hadoop学习系列--环境安装

先说踩的坑&#xff1a;刚开始学习&#xff0c;使用mac本安装单机hadoop&#xff0c;遭遇mac自身安全限制&#xff0c;到时dfs启动报错&#xff0c;解决后又出现新的问题&#xff0c;部分所需端口无法申请到&#xff0c;导致hadoop启动时报。 最终决定&#xff0c;使用虚拟机&…