zoukankan      html  css  js  c++  java
  • 空宏-标C中空宏的妙用

    空宏的作用:

    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
  • 相关阅读:
    js--获得当前系统时间
    关于react记录
    循环运用记录
    react native环境的搭建
    video,audio的使用细则
    mongoDB 将mongodb添加到服务
    react 全选和全不选
    人生那么多不确定,你怕什么
    select样式的重写
    关于动态插入出现undefined
  • 原文地址:https://www.cnblogs.com/feng9exe/p/8434941.html
Copyright © 2011-2022 走看看