#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__))
protos
?在哪里定义?#x
?__unused
已经存在时需要__unused__
?__const__
,__noreturn__
,__unused__
定义在哪里?答案 0 :(得分:9)
protos
是宏参数。它在__P(protos)
中定义,其范围直到行尾。在这种情况下,宏调用int func(__P(int foo))
将被int func(int foo)
替换,int func()
是一个“ANSI样式”函数原型,而不是预标准C,它不一定声明函数参数。在这样的预标准编译器上,宏将被定义为没有扩展,因此编译器只能看到#x
。
x
是stringize运算符。它通过添加引号将其参数x
的内容转换为字符串。如果传递给__unused
的参数包含宏,则在字符串转换完成之前不会展开它们。
这些宏用于为不同的平台定义不同的东西。 __unused
可能扩展到GCC或MSVC上的不同内容。
它们是编译器内部的钩子。头文件提供了编译器内部和标准语言之间的接口。编译器可以直接使用__attribute__
作为扩展关键字,但作者更喜欢在{{1}}周围定义统一的接口。
答案 1 :(得分:4)
protos
是__P
的参数,刚刚传递。#x
表示从x
中创建一个字符串。 __STRING(abc)
替换为"abc"