4
#if defined(__STDC__) || defined(__cplusplus)
#define __P(protos) protos      /* full-blown ANSI C */
#define __CONCAT(x,y)   x ## y
#define __STRING(x) #x


 #define    __unused    __attribute__((__unused__))
 #define    __dead2     __attribute__((__noreturn__))
 #define    __pure2     __attribute__((__const__))
  1. 是什么protos?它在哪里定义?
  2. 是什么#x
  3. 为什么需要已经__unused存在__unused__
  4. __const__, __noreturn__,在哪里__unused__定义?
4

2 回答 2

9
  1. protos是宏参数。它在中定义,__P(protos)其范围一直到行尾。在这种情况下,宏调用int func(__P(int foo))将被替换int func(int foo)为“ANSI 风格”函数原型,而不是不一定声明函数参数的预标准 C。在这样的预标准编译器上,宏将在没有扩展的情况下定义,因此编译器只会看到int func().

  2. #x是字符串化操作符。它通过添加引号将其参数的内容x转换为字符串。如果传递给的参数x包含宏,则在字符串转换完成之前不会扩展它们。

  3. 这些宏用于为不同的平台定义不同的东西。__unused可能会扩展到 GCC 或 MSVC 上的不同内容。

  4. 它们是编译器内部的钩子。头文件提供了编译器内部和标准语言之间的接口。编译器可以直接__unused作为扩展关键字使用,但它的作者更喜欢在__attribute__.

于 2013-09-11T06:43:49.207 回答
4
  1. protos__P是刚刚传递的参数。
  2. #x意思是用x. __STRING(abc)被替换为"abc"
  3. 可能是维护、跨平台或统一的原因。没有上下文很难知道。
  4. 编译器扩展。请参阅编译器的文档。
于 2013-09-11T06:42:40.327 回答