一起来看看C语言的预处理注意点

 更新时间:2022年03月27日 15:19:33   作者:熠熠L  
这篇文章主要为大家详细介绍了C语言的预处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

C 预处理器

C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。

指令描述
#define定义宏
#include包含一个源代码文件
#undef取消已定义的宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#if如果给定条件为真,则编译下面代码
#else#if的替代方案
#elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个 #if……#else 条件编译块
#error当遇到标准错误时,输出错误消息
#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

1.取消已定义宏

demo.h文件代码如下

#ifndef     __DEMO_H_
#define    __DEMO_H_


#define PAI 3.14


#endif // __DEMO_H_
#include <stdio.h>
#include "demo.h"

/* 在 #include 与 main 函数中间区域使用#undef来取消以定义的宏,然后重新定义宏 */

#undef PAI
#define PAI 33.14


int main()
{
    printf("PAI = %G\n", PAI);
}

/*
输出结果
PAI = 33.14
*/

2.使用#ifdef来调试

#ifdef DEBUG

/* 你的调试代码 */

#endif // DEBUG

如果定义了 DEBUG,则执行处理语句。在编译时,如果您向 gcc 编译器传递了 -DDEBUG 开关量,这个指令就非常有用。它定义了 DEBUG,您可以在编译期间随时开启或关闭调试。

常用预定义宏

描述
__DATE__当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。
__TIME__当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。
__FILE__这会包含当前文件名,一个字符串常量。
__LINE__这会包含当前行号,一个十进制常量。

预处理器运算符 

1.宏延续运算符

\一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符\

#include <stdio.h>


#define PAI  \
                3.1415926

int main()
{
    printf("%.8f\n", PAI);
}

2.字符串常量化运算符#

在宏定义中,当需要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符#。在宏中使用的该运算符有一个特定的参数或参数列表。就是把宏的参数变成字符串。

#include <stdio.h>


#define PAI 3.1415926
//字符串常量化
#define CONVERT_TO_STR1(arg) "字符串常量化:" #arg
//字符串常量化
#define CONVERT_TO_STR2(arg) CONVERT_TO_STR1(arg)

int main()
{
    printf("%s\n", CONVERT_TO_STR1(ABC));
    printf("%s\n", CONVERT_TO_STR1(PAI));
    printf("%s\n", CONVERT_TO_STR2(PAI));
}

/*
输出结果
字符串常量化:ABC
字符串常量化:PAI
字符串常量化:3.1415926
*/

这里有几点需要提一下。

1.宏定义中,当有多个字符串需要连接时,以空格来隔开每一个字符串即可。

2.当需要把一个宏字符串常量化时,需要按照先定义一个宏函数1,然后再定义一个宏函数2,然后宏函数2调用宏函数1即可,例如CONVERT_TO_STR2调用CONVERT_TO_STR1

3.标记粘贴运算符##

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。

#include <stdio.h>


#define PRINTF1(arg) printf("var" #arg "  = %d\n" , var##arg)

int main()
{
    int var1 = 20;
    PRINTF1(1);
}


/*
输出结果
var1  = 20
*/

参数化的宏

使用注意点

用宏定义时,含参数时,参数本身要加(),此外,对参数的操作整体也要加()。

#define MAX(a,b) ((a)>(b)?(a):(b))

使用宏函数的时候不要使用++/--运算符

#include <stdio.h>


#define MIN(A,B) ((A)<(B)?(A):(B))

int main()
{
    char *p="ghi";
    char a;
    a=MIN(*p++,'f');//不要使用自增/自减运算符
    printf("%c\n",a);
}


/*
输出结果
f
*/

另,宏定义实现指定大小的交换:

#define SWAP(a, b, size)    \
    unsigned int __size = (size);    \
    char *__a = (a), *__b = (b);    \
    do    \
    {    \
        char __tmp = *__a;    \
        *__a++ = *__b;    \
        *__b++ = __tmp;    \
    } while (--__size > 0);

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

相关文章

  • Qt项目实战之方块游戏的实现

    Qt项目实战之方块游戏的实现

    这篇文章主要为大家详细介绍了如何利用Qt实现简易的方块游戏,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++中volatile关键字的使用详解以及常见的误解

    C++中volatile关键字的使用详解以及常见的误解

    volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等
    2020-01-01
  • C语言深入探究选择排序与基数排序使用案例讲解

    C语言深入探究选择排序与基数排序使用案例讲解

    算法中排序是十分重要的,而每一个学习计算机的都会在初期的时候接触到这种排序,下面这篇文章主要给大家介绍了关于c语言选择排序与基数排序使用的相关资料,需要的朋友可以参考下
    2022-05-05
  • C++实现LeetCode(312.打气球游戏)

    C++实现LeetCode(312.打气球游戏)

    这篇文章主要介绍了C++实现LeetCode(312.打气球游戏),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 基于Qt开发获取CTP量化交易接口测试数据工具

    基于Qt开发获取CTP量化交易接口测试数据工具

    这篇文章主要为大家详细介绍了如何使用Qt软件开发K线股P相关软件,先开发一个通过CTP量化交易的sdk获取相关推送数据的工具,需要的可以参考下
    2024-04-04
  • C语言基础野指针与空指针示例分析

    C语言基础野指针与空指针示例分析

    全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持
    2021-11-11
  • 基于Matlab实现抖音小游戏苹果蛇

    基于Matlab实现抖音小游戏苹果蛇

    最近抖音上苹果蛇小游戏大火,为了证明MATLAB无所不能,咋能不跟风做一个?文中详细讲解了游戏的实现步骤,感兴趣的小伙伴可以尝试一下
    2022-06-06
  • C语言文字艺术之数据输入输出

    C语言文字艺术之数据输入输出

    这篇文章主要介绍了C语言文字艺术之数据输入输出,C语言的语句用来向计算机系统发出操作指令。一条语句编写完成经过编译后产生若干条机器指
    2022-07-07
  • Qt实现简易毛玻璃效果的示例代码

    Qt实现简易毛玻璃效果的示例代码

    这篇文章主要介绍了Qt如何利用模糊功能实现简易的毛玻璃效果,并且鼠标可以移动无边框窗口,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • 使用C++创建多个IPC机制的上层接口

    使用C++创建多个IPC机制的上层接口

    设计一个上层的IPC接口,这个接口将在未来封装底层的通信机制,这样的设计要求接口足够抽象,以便于底层实现的细节对上层用户透明,本文给大家介绍了如何使用C++创建多个IPC机制的上层接口,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论