C语言符号是可以偷梁换柱的
属性
C语言里有时会看到__attribute__
这个东西,它就是表示要描述属性了。
gcc的通用属性可以参考Common-Function-Attributes
alias
alias属性可以给符号起一个别名,两个名字用起来就会是一样的效果。
extern 类型 新名字 __attribute__((alias("旧名字")));
代码演示
- 代码中有一个
void test(int value)
函数的完整定义,main
函数对其进行了调用,传值为0 -
IAmNotTest
是一个新名字,它和test
是等价的 -
IAmNotTestTo
也是个新名字,这里用typeof(IAmNotTest)
来声明它的类型,就不用写成函数形式了
#include <stdio.h>
void IAmNotTest(int value) __attribute__((alias("test")));
typeof(IAmNotTest) IAmNotTestToo __attribute__((alias("test")));
void test(int value){
printf("I am No.%d\n", value);
}
int main()
{
test(0);
IAmNotTest(1);
IAmNotTestToo(2);
return 0;
}
输出
I am No.0
I am No.1
I am No.2
三个名字都可以调用到原始函数,所以每个名字都是有效的。
为什么
IAmNotTest
的声明可以在test
前面?