宏的几种特殊用法

简介: 1. 屏蔽“未使用参数”警告 在OceanBase中ob_define.h中就使用了这种宏,将传入的数据强制转化为void型。 #ifndef UNUSED #define UNUSED(v) ((void)(v)) #endif 这种宏主要是为了屏蔽“未使用参数”的警告,如下面这个函数用两个参数,但是一个都不用的话,某些编译器就会报出警告

1. 屏蔽“未使用参数”警告

在OceanBase中ob_define.h中就使用了这种宏,将传入的数据强制转化为void型。

   #ifndef UNUSED
    #define UNUSED(v) ((void)(v))
    #endif


这种宏主要是为了屏蔽“未使用参数”的警告,如下面这个函数用两个参数,但是一个都不用的话,某些编译器就会报出警告:认为p和mod_id都没有使用。所有我们使用UNUSE宏,这样两个参数都被使用了,但是实际上没有做任何有效的动作,以此来屏蔽“未使用参数”警告。

 virtual void mod_free(void* p, const int32_t mod_id = 0)
 { 
    UNUSED(p); 
    UNUSED(mod_id); 
 }


2. 指定字节对齐

在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
1) 使用伪指令#pragma pack (n),编译器将按照n个字节对齐。
2) 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
3) __attribute__((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
4) __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。

#define CACHE_ALIGNED __attribute__((aligned(CACHE_ALIGN_SIZE)))


3. 可变参数宏

我们指定,有些函数的参数是可变的,例如printf函数,指定第一个为格式化字符串以后,后面可以跟个数不定的参数,同样,宏也可以指定多个参数。有两种方法可以做到。
一是使用args...##args,二是使用...__VA_ARGS__。下面是两种方式定义的两个宏,这两个宏都能在printf字符串前,先输出一个字符串,达到相同的效果。

#define P_Debug(format,args...) \
{\
    printf("[DeBug]");\
    printf(format,##args);\
}while(false)
#define P_Release(format,...) \do{\
    printf("[Release]");\
    printf(format,__VA_ARGS__);\
}while(false)


使用的时候为:

P_Debug("%s:%d\n","good",100);
P_Release("%s:%d\n","good",100);


4. ###,#@的区别

假设定义3个宏,

#define A(x) T_##x
#define B(x) #@x
#define C(x) #x


则下面展开后为
A(1)------>T_1
B(1)------>'1'
C(1)------>"1"


欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!


相关文章
|
6月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
6月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
138 1
|
6月前
|
Rust 编译器 开发者
Rust中的进阶宏:派生宏与属性宏
本文将深入探讨Rust编程语言中的派生宏(Derive Macros)和属性宏(Attribute Macros)这两种进阶宏的用法。派生宏用于自动生成实现特定trait的代码,而属性宏则允许我们为模块、函数、结构体等添加自定义属性。我们将通过实例展示如何在Rust项目中使用这些高级宏来增强代码的可读性和可维护性。
|
11月前
宏定义和带参数的宏
宏定义和带参数的宏
64 0
|
C++
C++宏 #与##的区别
C++宏 #与##的区别
54 0
|
存储 安全 编译器
【为什么】C++中的宏
【为什么】C++中的宏
133 0
|
算法 C++
你是真的“C”——宏与函数的英雄本色
一、何为宏? 在进行宏和函数的对比时,我们先了解一下什么是宏。 #define 定义宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下面是宏的申明方式: #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
121 0
|
C++
C++学习003-#define 自定义宏
C++中可以用#define来定义自定义的宏 也可以用使用#define来定义常量
97 0
|
C++ Windows 编译器
下一篇
无影云桌面