阿里高级工程师对C语言预处理指令的理解

news2024/11/25 2:59:33

 

目录

预处理器指令列表

预处理器指令的流程

四种主要类型的预处理器指令

结论

我们可以将预处理器视为一个编译过程,该过程在开发人员运行程序时运行。它是使用 c/c++ 语言执行程序的预处理。若要初始化预处理器命令的进程,必须使用哈希符号 (#) 进行定义。它最好是非空白字符,为了更好的可读性,预处理器指令应该从第一列开始。

预处理器指令列表

要对某个语句执行预处理器程序,一些预处理器指令类型包括:

  • #define:它使用宏替换预处理器。
  • #include:从另一个文件插入某个标题会有所帮助。
  • #undef:它取消定义某个预处理器宏。
  • #ifdef:如果定义了某个宏,则返回 true。
  • #ifndef:如果未定义某个宏,则返回 true。
  • #if、#elif、#else和#endif:它使用特定条件测试程序;这些指令也可以嵌套。
  • #line:它处理错误和警告上的行号。它可用于在编译时生成输出时更改行号和源文件。
  • #error和#warning:它可用于生成错误和警告。
  • 可以执行#error以停止编译。
  • 执行#warning以继续编译控制台窗口中的消息。
  • #region和#endregion:为了定义代码的各个部分以使它们更易于理解和可读,我们可以使用扩展和折叠功能来使用该区域。

预处理器指令的流程

  1. 开发人员编写 C 程序>,程序检查是否有任何可用的预处理器指令。
  2. 如果可用,它将执行预处理器的操作事件,编译器将生成目标代码。然后,链接器将执行该代码。
  3. 如果没有可用的预处理器指令,它将转到编译器。然后,编译器将生成目标代码,然后通过链接器执行代码。

在本文中,我们将查看预处理器指令的各种示例。

四种主要类型的预处理器指令

1. 宏观扩张

在宏扩展中,我们可以指定两种类型的带有参数的宏:

我们还可以将参数传递给宏;它可以用与函数类似的参数来描述。

语法:

#define名称替换文本

哪里

  • 名称:在这里,我们可以定义微模板。
  • 替换文本 :我们可以将其定义为宏扩展。
  • 要编写宏名称,我们需要使用大写字母。
  • 为了更好的可读性,我们可以在某些宏上定义合适的名称。
  • 修改程序:我们只能更改宏,它可以反映在程序上。因此,我们不需要每次都更改它。

示例:基本宏

#define 打印下限 50

空主()

{

国际J;

for (j=1;i<=PrintLOWER; j++)

     {

printf(“\n%d”, j);

     }

}

示例:具有某些参数的宏

#define面积(a) (5.18 * a * a)

空主()

{

浮点数 r = 3.5, x;

x = 面积 (r);

printf (“\n 圆面积 = %f”, x);

}

预定义宏的类型

文件包含语句的示例:

3. 条件编译

语法:

#if 测试你的条件 <= 8

报表1;

报表2;

报表3;

报表4;

#else

报表5;

报表6;

报表7;

#endif

  • ___TIME___使用“HH:MM: SS”格式的字符文本定义当前时间。
  • 当编译器符合 ANSI 标准时,___STDC___指定为 1。
  • ___TIMESTAMP___指定时间戳“DDD MM YYYY DATE HH:MM: SS”。它用于定义当前源文件的最新修改的日期和时间。
  • ___LINE___由带有十进制常量的当前行号组成。
  • ___FILE___使用字符串文本包含当前文件名。
  • ___DATE___显示当前日期,字符文本采用“MMM DD YYYY”格式。
  • 2. 文件包含

    对于文件包含,我们可以使用#include。

    语法:

    #include类型您的文件名

  • 我们可以在写入某个指令的位置替换文件名中包含的内容。
  • 我们可以使用包含文件的指令并将头文件包含在程序中。
  • 我们可以将函数声明、宏和外部变量的声明集成到顶部头文件中,而不是在程序中的每个逻辑中重复。
  • stdio.h 头文件包含函数声明,可以提供有关输入和输出的详细信息。
  • i) #include “定义您的文件名”:在这个例子中,我们可以通过简单的搜索来搜索当前工作目录中的文件。
  • ii) #include <定义您的文件名>:在这个例子中,我们可以定义一个特定的目录,并在其中搜索一个文件。
  • 我们可以在需要定义条件逻辑的某个逻辑上使用条件编译。
  • 它利用#if、#elif、#else和#endif等指令。

4. 其他指令

除了上述指令之外,还有两个不常用的杂项指令。

#undef:我们可以将此指令与#define指令一起使用。它用于取消定义指定的宏。 #pragma:我们可以在需要定义打开或关闭特定功能的某个级别使用此指令。我们可以将这些类型的指令用于特定于编译器的指令,该编译器具有一定的编译器编译器范围。下面讨论#pragma指令的示例:

在 Empfun2() 上打印逻辑

代码示例:#pragma指令

#include <您的包含文件>

使用命名空间 Emp;

void Empfun1();

void Empfun2();

#pragma创业公司Empfun1

#pragma退出 Empfun2

void Empfun1()

{

cout << “在 Empfun1()\n 上打印逻辑”;

}

void Empfun2()

{

cout << “在 Empfun2()\n 上打印逻辑”;

}

int main()

{

void Empfun1();

void Empfun2();

cout << “打印主输出 ()\n”;

返回 0;

}

输出:

在 Empfun1() 上打印逻辑

打印主输出 ()

  • #pragma启动和#pragma退出:这些指令推送以指示在程序作为启动之前(在控件移动到main()之前)和程序退出之前(仅在控件从main()返回之前)运行所需的函数。

#pragma警告指令:

Pragma 指令是我们可以用来关闭和打开以启用某些功能的特定指令。杂注指定从一个编译器到另一个编译器的范围。Microsoft C 编译器提供了编译指示,这些编译指示提供了在编译器生成的目标文件中提供注释的列表和放置方法。Prgama 有其特定于自定义的实现规则指令,可以根据特定场景进行定义。

杂注启动和#pragma退出:这些杂注指令被定义为某些函数,这些函数可用于确定在程序启动之前运行,可以在 main() 之前指定,也可以在控件从 main() 返回之前应用程序退出之前指定。

例:

#include<stdio.h>

void testFun1(();

void testFun2();

#pragma启动测试Fun1

#pragma退出测试Fun2

void testFun1()

{

printf(“It is Inside the testFun1()\n”);

}

void testFun2()

{

printf(“It is Inside the func2()\n”);

}

int main()

{

printf(“It is Inside the function of main()\n”);

返回 0;

}

输出

它在测试中Fun1()

它在 main() 的函数内部

它在 func2() 内部

结论

我们希望本文能帮助您了解预处理器指令。在本文中,我们通过使用 c# 或 C++/C 编程的示例代码讨论了预处理器指令的各种定义和技术。我们还通过各自的语法和示例学习了它们的类型。本文将对来自.net和JAVA背景的应用程序开发专业开发人员,应用程序体系结构,云专家,测试人员以及其他寻求Spring数据各种类型机制不同用途的学习者有所帮助。

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

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

相关文章

【Devops运维】Docker搭建jenkins自动化编译hadoop/spark/flink/hive/kyuubi/trino大数据组件

Docker搭建jenkins DevOps概念Docker部署Jenkins制作Jenkins镜像Dockerfile及所依赖的脚本build镜像 利用docker-compose部署jenkins 配置Jenkins管理员密码插件安装系统配置全局工具配置MAVEN 配置JDK 配置GIT 配置MAVEN 配置 Jenkins Maven Git 自动化编译找到token生成界面…

ChatGPT:使用OpenAI创建自己的AI网站,使用 flask web框架快速搭建网站主体

使用OpenAI创建自己的AI网站 如果你还是一个OpenAI的小白&#xff0c;有OpenAI的账号&#xff0c;但想调用OpenAI的API搞一些有意思的事&#xff0c;那么这一系列的教程将仔细的为你讲解如何使用OpenAI的API制作属于自己的AI网站。 使用 flask web框架快速搭建网站主体 之前…

C++:布隆过滤器和哈希切分

目录 一. 什么是布隆过滤器 二. 布隆过滤器的实现 2.1 数据插入函数set 2.2 判断数据是否存在函数test 2.3 布隆过滤器数据的删除 三. 哈希切分 一. 什么是布隆过滤器 在我之前的博客C&#xff1a;使用位图处理海量数据_【Shine】光芒的博客-CSDN博客中&#xff0c;介绍了…

【LinuxShell】linux防火墙之firewalld防火墙

文章目录 前言一、firewalld概述1. 概念2. firewalld和iptables的关系 二、firewalld网络区域1. firewalld区域的概念2. firewalld预定义区域3. firewalld数据包的处理3.1 firewalld数据处理流程3.2 firewalld检查数据包的源地址的规则3.3 总结 三、firewalld防火墙的配置方法1…

“GPT+医疗健康”:给予医疗领域新机遇

现如今&#xff0c;GPT十分火热。随着人们对健康医疗的关注越来越热切&#xff0c;GPT已逐渐成为健康医疗领域的重要角色之一。GPT可以用于许多医疗语境中&#xff0c;如医学咨询、病症诊断、健康建议、在线问诊、患者教育、健康数据跟踪等。 GPT是一种基于深度学习的自然语言处…

结构体-C语言

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

【Python办公自动化】python实现将图片插入到word中指定位置并将word转换为图片

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

垃圾站养殖场除臭杀菌解决方案

养殖场和垃圾站都会产生大量的有机废气和垃圾&#xff0c;这些废气和垃圾会产生难闻的臭味&#xff0c;影响周围环境和居民健康。这些地方又是病菌和细菌的滋生地&#xff0c;这些细菌和病菌会对人类和动物的健康造成威胁。除臭杀菌系统可以杀灭这些细菌和病菌&#xff0c;也可…

换个思维方式,你离网工天花板会更近一点

大家好&#xff0c;我是许公子。 收到老杨的邀请&#xff0c;我正式加入网络工程师俱乐部了&#xff0c;未来会给你分享更多网工硬核内容。 和老杨聊天的过程中&#xff0c;我想起了在刚入社会一两年&#xff0c;我去参加了一个高中同学聚餐。 里面有自主创业的&#xff0c;…

软件测试被00后整顿职场了?

00后带来的压力 公司一位工作3年的老油条工资还没有刚来的00后高&#xff0c;她心中不平&#xff0c;对这件事情有不小的怨气&#xff0c;她觉得自己来公司三年了&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天勤勤恳恳&#xff0c;要加班的时候也愿意加班&#xff0…

Python竖版大屏 | 用pyecharts开发可视化的奇妙探索

你好&#xff01;我是马哥python说&#xff0c;一枚10年程序猿&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;正在试错用pyecharts开发可视化大屏的非常规排版。 以下&#xff0c;我用8种ThemeType展示的同一个可视化数据大屏。 1、SHINE主题 2、LIGHT主题 3、MACARO…

手撕代码——任意奇数分频

手撕代码——任意奇数分频 一、奇数分频器原理与设计 在上文《手撕代码——任意偶数分频》中&#xff0c;我们编写任意偶数分频的Verilog代码&#xff0c;对时钟进行偶数分频&#xff0c;只需要用到时钟的上升沿或者下降沿即可&#xff0c;而要进行N倍奇数分频&#xff0c;需要…

修改Allure报告窗口标题,Overview的标题文案,环境配置,左上角LOGO

前言 如下图所示&#xff1a; 一、修改Allure报告窗口标题 Allure-html测试报告的窗口标题保存在&#xff1a;allure-html目录下的index.html文件 写个 set_windows_title 方法&#xff0c;并在 run.py 的执行文件去调用即可修改&#xff08; 在html报告生成后&#xff09…

研报精选230522

目录 【行业230522东亚前海证券】新能源行业深度报告&#xff1a;政策东风与海外需求共振&#xff0c;充电桩迎新一轮增长周期 【行业230522西南证券】人工智能专题研究&#xff1a;AIGC投资框架 【行业230522国信证券】传媒互联网行业周报&#xff1a;OpenAI推出移动版及网页端…

文献笔记——A brief introduction to distributed systems(分布式系统)

本文主要讨论了分布式系统。作者提供了关于分布式系统的概述&#xff0c;是一份很好的新手教程。 Fig.1 大纲 在论文的第一部分&#xff0c;作者简要回顾了计算机的演变&#xff0c;指出了分布式系统的两个技术基础&#xff1a;性能强大的微处理器的发展和高速计算机网络的发明…

OpenCV:CMake 产生 VS2019 项目和解决方案

CMake 是一个跨平台的自动化编译程序&#xff0c;它用于管理代码的构建过程。使用 CMake 可以简化跨平台项目的构建和移植&#xff0c;提供简单而强大的语法来描述构建过程&#xff0c;并生成多种不同的构建系统&#xff0c;如 GNU Make、Ninja 和 Visual Studio。因为 CMake 具…

8年测试总结,性能测试问题大全,这些问题你应该认清的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 响应时间VS吞吐量…

18-02 数据库设计核心要点

概念结构设计 通过对用户需求进行综合、归纳和抽象&#xff0c;形成独立于具体数据库管理系统的概念模型把需求分析阶段得到的应用需求&#xff0c;抽象成概念模型连接现实世界和信息世界的桥梁好的概念结构设计 能真实、充分的反映现实世界要易于理解要易于修改 基本概念 …

kubeadm部署k8s 1.26.0版本高可用集群

1.前言 本次搭建使用centos7.9系统&#xff0c;并且使用haproxykeepalived作为高可用架构软件&#xff0c;haproxy实现k8s集群管理节点apiserver服务的负载均衡以实现集群的高可用功能&#xff0c;keepalived保障了hapxoy的高可用&#xff0c;容器引擎使用docker&#xff0c;需…

迁移iceberg:一.查看所需要的资源。

一&#xff1a;内存&#xff0c;CPU&#xff0c;核数&#xff0c;线程&#xff0c;硬盘。 1. cpu&#xff0c;核素&#xff0c;线程。 cpu cpu就相当于人类的大脑&#xff0c;是处理数据的地方。 cpu由以下三个组成。 控制器。由控制单元、指令译码器、指令寄存器组成。运算…