空的宏定义作用及常见用法

我们学习宏定义的第一个概念是,宏定义作为替换作用。

例如:

#define SIZE 32    // 接下来代码使用SIZE就相当于32

宏定义是编译器在编译时,将程序中所有SIZE替换成32,我这里就不详细将宏定义的知识,

下面讲讲在项目中,看到空的宏定义是什么情况以及它作用和用法。

先看看项目中的代码, 如下:

#ifndef SQLITE_API
# define SQLITE_API
#endif

这个宏定义什么都没有,作用是什么呢?

作用是标志

#ifndef __TYPE_DEFINE__
# define __TYPE_DEFINE__   #include <stdio.h>
    typedef unsigned int uint32 ;
    int func(int x, int y);
#endif

再看看上面这段代码,这时防止头文件重复的用法。空宏定义跟这个其实一样的,仅仅只是定义的内容是空的,

但是,我们可以判断这个宏定义是否曾经被定义过。

使用方法:

#ifdef __TYPE_DEFINE__
/* 代码段1 */
#else
/* 代码段2 */
#endif

在make menuconfig 启动编译的时候,里面其实很多代码是这样预留出来的,我们通过启动config文件的某个选项: [*] DEBUG

背后其实一般这样实现的。

还有很多用处,此文待续~~

 

原文地址:https://www.cnblogs.com/Mr-Tortoise/p/9153096.html

时间: 2024-10-17 06:35:13

空的宏定义作用及常见用法的相关文章

do...while(0)在宏定义中的巧妙用法

大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) do { if(NULL != p) delete p; p = NULL; }while(0) 这时,do-while(0)的功能就不仅仅是循环了,这是do..while(0)的一种巧妙用法.它有以下几种功能: 1.在后面要加分号,使调用如同函数:调用如下: int* p = new int(5)

宏定义中的常见使用

/*** *yy_room *2015-3-6 * * */ #include <iostream> #include <cstdio> using namespace std; /* * # 表示将一个宏的参数转换为字符串字面量 * ## 将两边记号连接在一起 * */ #define MACRO_GET_SET(T,VarName,FuncName) protected: T VarName; public: T get##FuncName() {return VarName;

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

为什么使用do{}while(0)来进行宏定义

最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) \ action1(); \ action2(); 在以下

c++ 宏定义 ## 的使用

一年半前,见过宏定义##的使用,实现类似反射机制,通过字符串创建类对象的代码,感觉很神奇. 两个月前,利用##的语法,实现一个小功能,通过机组字符串排列组合,调用一个万行代码,计算功能类的函数接口. 三四天前,简单概要的把代码提纯,记录下来,以备后用.代码量不多,但每次写都好费劲,至少写了5遍了,仍然费劲. main.cpp 1 #include <iostream> 2 #include "register.h" 3 #include "registerfun.

C语言 预处理二(宏定义--#define)

//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 #include<stdio.h> #include<stdlib.h> //知识点二-->宏定义作用 //宏定义作用1:起到替换作用,可以定义常量 #define X 10 //宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码) #define 水乃万物之源 m

宏定义中##和#的作用

解释1 : 定义中##和#的作用内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:1. ####是一个连接符号,用于把参数连在一起例如:> #define FOO(arg) my##arg则> FOO(abc)相当于 myabc2.#:是"字符串化"的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:> #define STRCPY(dst, src) strcpy(dst, #src)则> STRC

C语言宏定义时#(井号)和##(双井号)的用法

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号.比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP &quo