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

118 篇文章 62 订阅
103 篇文章 7 订阅

 

目录

预处理器指令列表

预处理器指令的流程

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

结论

我们可以将预处理器视为一个编译过程,该过程在开发人员运行程序时运行。它是使用 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数据各种类型机制不同用途的学习者有所帮助。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值