函数式宏定义的几种情况

来源:互联网 发布:随州seo服务 编辑:程序博客网 时间:2024/05/22 06:07
//main.c #define MAX(a,b) ((a)>(b)?(a):(b))          //a、b必须用括号扩起来。因为可能是个表达式,展开后运算优先级会变化k = MAX(i&2,j&2);#define STR(s) # s                          // #是个运算符,只能用于函数式宏定义,用于创建字符串。 s中有多个连续的空间或tab被替换为一个空格str = STR(lang      xian          wen);#define CONCAT(a,b) a##b                    // ##也是个运算符,可用于变量式宏定义,把ab两个符号连在一起, 如 android中 virtual ~I##INTERFACE();   concat = CONCAT(langx,ianwen);#define HASH_HASH # ## #                    // 把两个# 连载一起。hash_hash = HASH_HASH ;用cpp工具查看展开结果langu@langu:~/linuxk/link/define_macro/function_macro$ cpp main.c # 1 "main.c"# 1 "<built-in>"# 1 "<command-line>"# 1 "main.c"k = ((i&2)>(j&2)?(i&2):(j&2));str = "lang xian wen";concat = langxianwen;hash_hash = ## ;定义一个宏函数的时候,常定义在do { ... } while(0)里面.如:#define MAX(a,b) \        do {            ((a)>(b)?(a):(b)) } while(0)看android源码中 的例子一次定义类多个函数:#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \    const android::String16 I##INTERFACE::descriptor(NAME);             \    const android::String16&                                            \            I##INTERFACE::getInterfaceDescriptor() const {              \        return I##INTERFACE::descriptor;                                \    }                                                                   \    android::sp<I##INTERFACE> I##INTERFACE::asInterface(                \            const android::sp<android::IBinder>& obj)                   \    {                                                                   \        android::sp<I##INTERFACE> intr;                                 \        if (obj != NULL) {                                              \            intr = static_cast<I##INTERFACE*>(                          \                obj->queryLocalInterface(                               \                        I##INTERFACE::descriptor).get());               \            if (intr == NULL) {                                         \                intr = new Bp##INTERFACE(obj);                          \            }                                                           \        }                                                               \        return intr;                                                    \    }                                                                   \    I##INTERFACE::I##INTERFACE() { }                                    \    I##INTERFACE::~I##INTERFACE() { } 


原创粉丝点击