这些C宏是什么意思(protos,#x?,__ unused)?

时间:2013-09-11 06:37:58

标签: c macros

#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__定义在哪里?

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:4)

  1. protos__P的参数,刚刚传递。
  2. #x表示从x中创建一个字符串。 __STRING(abc)替换为"abc"
  3. 可能是维护,跨平台或一致性的原因。很难知道没有上下文。
  4. 编译器扩展。请参阅编译器的文档。