C语言宏定义提供了一些进阶操作

news2024/12/25 12:35:04

C语言宏定义提供了一些进阶操作,可以进行更灵活和复杂的宏定义。
以下是一些常见的进阶操作及其示例代码解释:

文章目录

    • 1.宏函数(Macro Function)
    • 2.条件表达式
    • 3.字符串拼接
    • 4.条件编译 (日志打印)
    • 宏的值为空时

在这里插入图片描述

1.宏函数(Macro Function)

宏可以像函数一样接受参数,并返回结果。
在宏定义中使用参数可以增加宏的灵活性。例如:

   #define ADD(a, b) ((a) + (b))

这个宏定义了一个宏函数ADD,它接受两个参数ab,并返回它们的和。

使用示例:

   int sum = ADD(3, 4);  // sum = 3 + 4 = 7

再比如

#define IFABC(a, b, c) c=a>b?a:b

void f() {
    int x, m=5, n=1;
    IFABC(m+n, m, x);
    printf("%d\n", x);  // 6
};

2.条件表达式

宏定义中可以使用条件表达式来根据不同的条件返回不同的结果。例如:

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

这个宏定义了一个宏函数MAX,它接受两个参数ab,并返回它们的较大值。

使用示例:

   int max = MAX(5, 7);  // max = 7

3.字符串拼接

宏定义中可以使用字符串拼接操作符##将多个字符串拼接在一起。例如:

   #define CONCAT(a, b) a##b

这个宏定义了一个宏函数CONCAT,它接受两个参数ab,并将它们拼接在一起。

使用示例:

   int result = CONCAT(10, 20);  // result = 1020

4.条件编译 (日志打印)

宏定义中可以使用条件编译指令,根据不同的条件选择性地定义宏。例如:

   #define DEBUG

   #ifdef DEBUG
   #define LOG(msg) printf("%s\n", msg)
   #else
   #define LOG(msg)
   #endif

这个宏定义了一个宏函数LOG,它接受一个参数msg,并根据宏DEBUG的定义与否选择性地输出日志。

   LOG("Debug message");  // 如果定义了DEBUG宏,则输出日志

宏的值为空时

在C语言中,#define指令用于创建宏定义。当#define后面只有标识符而没有对应的字符串或表达式时,它表示这个宏的值被定义为空。

例如,

#define AAA

表示宏AAA的值为空。这意味着在代码中,所有出现AAA的地方都会被替换为空。这样的宏定义可以用于条件编译或其他需要在编译时进行控制的情况。

下面是一个示例代码,用于说明#define AAA的意义:

#include <stdio.h>

#define AAA

int main() {
    #ifdef AAA
        printf("AAA is defined\n");
    #else
        printf("AAA is not defined\n");
    #endif

    return 0;
}

在上述代码中,
我们使用#define AAA定义了一个空宏AAA

main函数中,
我们使用条件编译指令#ifdef来判断宏AAA是否被定义。

因为宏AAA的值为空,
所以条件为真,会打印出"AAA is defined"。

如果我们注释掉#define AAA这行代码,
再次运行程序,条件为假,
会打印出"AAA is not defined"。

需要注意的是,即使宏的值为空,
它仍然是一个有效的宏定义
并且在代码中会被预处理器进行替换操作。

因此,编译器会将所有出现AAA的地方替换为空。

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

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

相关文章

2023物联网新动向:WEB组态除了用于数据展示,也支持搭建业务逻辑,提供与蓝图连线和NodeRed规则链类似的可视化编程能力

前言 组态编辑在工业控制、物联网场景中十分常见&#xff0c;越来越多的物联网平台也把组态作为一项标配功能。 物联网产业链自下往上由“端 - 边 - 管 - 云 -用”多个环节构成&#xff0c;组态通常是用于搭建数据展示类型的应用&#xff0c;而随着系统集成度越来越高&#x…

cocosCreator2.4.x 打包 ios ,xcode问题记录

Q&#xff1a;Uncaught ReferenceError: CC_PHYSICS_BUILTIN is not defined A&#xff1a;先clean build folder....&#xff0c;然后重新build Q&#xff1a;xcode 使用模拟器预览 报错 In /Library/Developer/Xcode/DerivedData/hello_world-djnvsdcqyfoqvdepilidvunfunto…

17-Sharding-jdbc

一 Sharding-JDBC介绍 1 背景 随着通信技术的革新&#xff0c;全新领域的应用层出不穷&#xff0c;数据存量随着应用的探索不断增加&#xff0c;数据的存储和计算模式无时无刻不面临着创 新。面向交易、大数据、关联分析、物联网等场景越来越细分&#xff0c;单 一数据库再也无…

IS-IS实验总结 (下)

路漫漫其修远兮&#xff0c;吾将上下而求索 今天发布一篇自己关于IS-IS的自我总结&#xff0c;和一些简单的实验&#xff0c;我写的肯定不是最全的&#xff0c;但是这是我进行的自我总结的文章&#xff0c;省去了许多高大上的冠冕堂皇的话语&#xff0c;节约您学习的时间。 我…

Ansible之playbook剧本

一、playbook概述1.1 playbook 介绍1.2 playbook 组成部分 二、playbook 示例2.1 playbook 启动及检测2.2 实例一2.3 vars 定义、引用变量2.4 指定远程主机sudo切换用户2.5 when条件判断2.6 迭代2.7 Templates 模块1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设…

php代理刷访问量(附源码)

众所周知&#xff0c;所谓的访问量就是用户的点击次数。当然&#xff0c;如果真只是单纯记录用户的访问次数&#xff0c;那访问量刷起来也太简单了&#xff0c;不断的刷新网页就行。因此&#xff0c;常规的网站记录访问量是通过ip来的&#xff0c;一个有效ip对应一个访问量。通…

【MySQL学习笔记】(八)复合查询

在前面的笔记中做的查询基本都是对一张表进行查询&#xff0c;在实际开发中远远不够&#xff0c;本篇文章内容是复合查询相关的笔记。需要用到oracle9i的经典测试表&#xff0c;在笔记&#xff08;六&#xff09;中已经教大家如何导入了。 复合查询 基本查询回顾多表查询子连接…

LinkedList(4):多线程LinkedList 不安全情况

多线程不安全演示&#xff0c;线程越多&#xff0c;现象越明显&#xff0c;这边只启了四个线程。 package com.example.demo;import java.util.LinkedList; import java.util.UUID;public class LInkedListThread {public static void main(String[] args) {final LinkedList&…

CLion远程Linux开发环境搭建及找不到Linux头文件的解决方法

CLion远程开发环境搭建及找不到Linux头文件的解决方法 文章目录 CLion远程开发环境搭建及找不到Linux头文件的解决方法1.前言2.远程开发3.远程编译4.远程调试5.远程开发Linux头文件找不到&#xff08;比如pthread.h、<sys/socket.h>&#xff09;6.最后 1.前言 在某些时候…

【iOS】Category、Extension和关联对象

Category分类 Category 是 比继承更为简洁 的方法来对Class进行扩展,无需创建子类就可以为现有的类动态添加方法。 可以给项目内任何已经存在的类 添加 Category甚至可以是系统库/闭源库等只暴露了声明文件的类 添加 Category (看不到.m 文件的类)通过 Category 可以添加 实例…

ABB 3BSE017427R1 NBIO-21CU控制模块

通道数目&#xff1a; NBIO-21CU 控制模块通常具有多个输入/输出通道&#xff0c;这些通道可以用于连接不同类型的传感器、执行器或其他外部设备。 输入/输出类型&#xff1a; 这种模块可以支持不同类型的输入和输出&#xff0c;包括数字输入、数字输出、模拟输入和模拟输出。…

lv3 嵌入式开发-7 linux shell脚本编程(分支语句、循环语句)

目录 1 分支语句 2 多路分支语句 3 for的用法 4 while的用法 5 循环控制语句 6 练习 1 分支语句 语法结构: if 表达式then 命令表fi 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用; …

(数字图像处理MATLAB+Python)第十二章图像编码-第一、二节:图像编码基本理论和无损编码

文章目录 一&#xff1a;图像编码基本理论&#xff08;1&#xff09;图像压缩的必要性&#xff08;2&#xff09;图像压缩的可能性A&#xff1a;编码冗余B&#xff1a;像素间冗余C&#xff1a;心理视觉冗余 &#xff08;3&#xff09;图像压缩方法分类A&#xff1a;基于编码前后…

搭建单机版FastDFS分布式文件存储系统

一、准备工作 1、下载FastDFS安装包和依赖包 https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.43 https://codeload.github.com/happyfish100/fastdfs/tar.gz/V6.06 https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.22 注&…

U盘之识别量产工具

了解常识 U盘&#xff08;USB闪存驱动器&#xff09;是一种可重复擦写的存储设备&#xff0c;具有便携、容量大、使用方便等特点&#xff0c;是现代电脑用户存储和传输数据的主要设备之一。 以下是关于U盘的常识&#xff1a; U盘的存储容量通常以GB&#xff08;千兆字节&#x…

Java对象内存分配流程

文章目录 一、前言二、Java对象内存分配流程2.1、分配流程2.2、什么是逃逸分析&#xff1f;2.2.1逃逸分析主要关注两个方面的信息&#xff1a;2.2.2逃逸分析的好处包括&#xff1a;2.2.3、为什么要分配到栈上&#xff1f; 2.3、什么是大对象&#xff1f;2.4、什么是TLAB&#x…

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性&#xff1a;2.2.2、传统部署方式&#xff1a;2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…

SpingMvc入门

SpingMvc入门 1.MVC Spring的工作流程&#xff1a;2.sping mvc入门3.静态资源处理 前言 Spring MVC是一种基于Java的web应用开发框架&#xff0c;它采用了MVC&#xff08;Model-View-Controller&#xff09;设计模式来帮助开发者组织和管理应用程序的各个组件。 1.MVC Spring的…

Spring Security安全登录的调用过程以及获取权限的调用过程

1.第一次登录时候调用/user/login整个流程分析 (0)权限授理 首先调用SecurityConfig.java中的config函数将jwtAuthenticationTokenFilter过滤器放在UsernamePasswordAuthenticationFilter之前 Override protected void configure(HttpSecurity http) throws Exception{......…

2023-9-4 欧拉函数

题目链接&#xff1a;欧拉函数 #include <iostream>using namespace std;int main() {int n;cin >> n;while(n --){int x;cin >> x;int res x;for(int i 2; i < x / i; i){if(x % i 0){res res / i * (i - 1); // 公式 N * (1 - 1 / p1) * (1 - 1/ p2…