空宏的作用:
1)编译指示;
2)方便阅读;
定义宏,并在预处理过程中将其替换为空字符串(即删除)
偶然的机会,看到了下面的C代码:
ISC_PLATFORM_NORETURN_PRE static void
library_fatal_error(const char *file, int line, const char *format,
va_list args)
ISC_FORMAT_PRINTF(3, 0) ISC_PLATFORM_NORETURN_POST;
其中ISC_PLATFORM_NORETURN_PRE 和ISC_PLATFORM_NORETURN_POST,ISC_FORMAT_PRINTF是宏。具体定义如下:
#define ISC_PLATFORM_NORETURN_PRE __declspec(noreturn)
#define ISC_PLATFORM_NORETURN_POST
#define ISC_FORMAT_PRINTF(fmt, args) __attribute__((__format__(__printf__, fmt, args)))(GCC中设置函数属性、变量属性、类型属性的一种机制,用来设置在这个宏前面的有关函数的一些属性)。
这段代码是一个老外写的,编译也没有错误;可这样的语法却很少见(在函数的末尾加上了一个空宏)。
这里ISC_PLATFORM_NORETURN_POST就是所谓的空宏,空宏(未定义的宏)都展开为空字符串,但定义为空字符串的宏被视为是在预处理表达式定义的,一般的用法是在#ifdef/#endif和#ifndef/#endif的条件编译语句中。#ifdef/#endif判断ifdef后面的宏是否定义,如果定义了,则对下面的代码或语句编译,是有条件的编译;#ifndef/#endif和#define配合使用,取消定义用undef宏,作用和#ifdef/#endif基本一样。
但是像这样放在函数的末尾还是不多见的,在预编译时,空宏将被替换成一个空字符串,它的值是0.这里的空宏只是为了增加代码的可读性,起注释、说明的作用,其实完全可以不加的,完全可有可无的,但是加上了,看起来能更清晰些。;而且这两个宏一般都是配对使用的(空宏也可以放在函数的开头)。
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#define debugMethod() NSLog(@"%s", __func__)
#else
#define NSLog(...)
#define debugMethod()
#endif
那个是空宏定义
最典型的是
#define DEBUG
#define UNICODE
如果像这样,define后面只有一个名字,那么这个宏是空的,不会对代码产生影响。
https://zhidao.baidu.com/question/2052228231264944147.html