返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一起来看看C语言的预处理注意点
  • 605
分享到

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

2024-04-02 19:04:59 605人浏览 安东尼
摘要

目录C 预处理器1.取消已定义宏2.使用#ifdef来调试常用预定义宏预处理器运算符 1.宏延续运算符2.字符串常量化运算符#3.标记粘贴运算符##参数化的宏总结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"



#undef PAI
#define PAI 33.14


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


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));
}


这里有几点需要提一下。

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);
}


参数化的宏

使用注意点

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

#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);
}


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

#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);

总结

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

--结束END--

本文标题: 一起来看看C语言的预处理注意点

本文链接: https://lsjlt.com/news/144034.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一起来看看C语言的预处理注意点
    目录C 预处理器1.取消已定义宏2.使用#ifdef来调试常用预定义宏预处理器运算符 1.宏延续运算符2.字符串常量化运算符#3.标记粘贴运算符##参数化的宏总结C 预处理...
    99+
    2024-04-02
  • 一起来看看C语言世界中的结构体
    目录一、结构体的概念:二、结构体变量的定义和初始化结构体变量的定义(1)单独定义(2)混合定义(在定义结构体的同时定义结构体变量)结构体变量的初始化 三、结构体变量的使用(...
    99+
    2024-04-02
  • 一起来看看C语言线性表的线性链表
    目录定义1.插入2.建立线性链表1)头插法2)尾插法3.删除4.查找5.求线性链表的表长总结定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,每一个结点包含两个域:存放数据...
    99+
    2024-04-02
  • Python语言的自我介绍一起来看看
    目录自我简介一、Python的发展历程   二、Python的特色1.语言特色2.语法特色三、Python2与Python3的比较1.print 函数2.Unicode3.除法运算4...
    99+
    2024-04-02
  • 一起来学习C语言的程序环境与预处理
    目录1.程序的翻译环境和执行环境2.gcc C语言编译器来演示编译过程2.1编译2.2编译:2.3运行环境3详解预处理3.1预定义符号3.2#define3.2.1#define定义...
    99+
    2024-04-02
  • 一起来看看springboot集成redis的使用注解
    目录redis简介:引入依赖:编写application.properties文件编写配置类:springboot的redis注解介绍(1)缓存@Cacheable(2)缓存@Cac...
    99+
    2024-04-02
  • 一起来看看Vue的核心原理剖析
    目录前言:学习目标:Object.definePropertyget、set数据反应到视图视图的变化反映到数据M -> VV -> M优化工作:总结前言: 相信大家阅读过...
    99+
    2024-04-02
  • C++设计模式中的观察者模式一起来看看
    设计模式:观察者模式 观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。 发布者接口 #ifndef __observerPatterns_publish_hpp__ #d...
    99+
    2024-04-02
  • 一起来了解c语言的str函数
    目录strlen:strcmp:strcpy:strcat:strstr:atoi:总结strlen: 用于求字符串长度,从首字符开始,到'\0'结束,'\0...
    99+
    2024-04-02
  • C语言的预处理介绍
    目录前言一、预定义符号二、#define1.宏2.宏与函数3.带副作用的宏参数4.宏和函数的不同5.#undef三、条件编译四、文件包含总结前言 编译一个C语言程序涉及很多步骤。其中...
    99+
    2024-04-02
  • c语言中预处理器是什么意思
    这篇文章主要介绍“c语言中预处理器是什么意思”,在日常操作中,相信很多人在c语言中预处理器是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c语言中预处理器是什么意思”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • 一起来学习C语言的输入和输出
    目录一、scanf() 和 printf() 函数实例二、getchar() 和 putchar() 函数实例1实例2三、gets() 和 puts() 函数实例...
    99+
    2024-04-02
  • 详解C语言的预处理效果
    目录前言一、预定义符号二、#define1.宏2.宏与函数3.带副作用的宏参数4. 宏和函数的不同5.#undef三、条件编译四、文件包含1.函数库文件包含2.本地文件包含总结前言 ...
    99+
    2024-04-02
  • C语言中预处理的示例分析
    小编给大家分享一下C语言中预处理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!#define定义宏带副作用的宏参数我们来看如下一段代码结果分别为12,1...
    99+
    2023-06-25
  • 详解C语言中的预处理命令
    目录一、预处理命令简介二、宏定义1、宏定义的定义2、宏定义的使用3、宏定义的终止——#undef三、文件包含初学C语言的时候,我们会在开头写下一句话,#inc...
    99+
    2022-12-08
    C语言预处理命令 C语言预处理
  • c语言的预处理命令有哪些
    C语言的预处理命令有以下几种:1. #include:用于包含头文件。2. #define:用于定义宏。3. #ifdef、#ifn...
    99+
    2023-08-18
    c语言
  • c语言预处理的作用是什么
    C语言预处理器是C语言编译器的一部分,它主要用于对源代码进行预处理,其作用包括: 宏定义和宏替换:预处理器可以定义宏,并在源代码...
    99+
    2024-03-12
    c语言
  • 一文带你搞懂C语言预处理宏定义
    目录预定义符号#define#define 定义标识符#define 定义宏替换规则# 和##预定义符号 这些预定义符号都是语言内置的 __FILE__ //进行编译的源文...
    99+
    2022-11-13
    C语言预处理宏定义 C语言 宏定义 C语言 预处理
  • 一起来学习C语言的字符串转换函数
    字符串转整数 字符串转换为整数的函数有两个,他们的函数原型如下: int __cdecl atoi(const char *_Str); long __cdecl atol(...
    99+
    2024-04-02
  • PHP 异常处理与其他编程语言的对比:看看谁更胜一筹!
    PHP 作为一门非常流行的编程语言,其异常处理机制也具有自己的特色和优势。本文将对 PHP 异常处理与其他编程语言的异常处理机制进行对比,以帮助更好地理解和使用 PHP 异常处理。 PHP 异常处理机制 PHP 异常处理机制主要包括以下...
    99+
    2024-02-24
    异常处理 编程语言 比较 PHP Java Python C++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作