gcc是否在功能签名中添加属性? 如果它们在同一个源文件中,这些编译得好吗?
void*__attribute__ ((noinline)) GetCurrentIp(void) {
some code...
}
void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)
答案 0 :(得分:2)
即使问题是关于C,我们也可以让g ++回答它(见Function Names as Strings)。
f.C
:
#include <stdio.h>
extern "C"
void *__attribute__((noinline)) GetCurrentIp(void)
{
printf("signature of %s: %s\n", __func__, __PRETTY_FUNCTION__);
return __builtin_return_address(0);
}
int main()
{
GetCurrentIp();
return 0;
}
> g++ f.C
> a.out
signature of GetCurrentIp: void* GetCurrentIp()
因此,该属性不是签名的一部分。
答案 1 :(得分:1)
不,它没有。属性不会添加到函数签名中,因此您将收到ü
主要原因是函数签名是语言的一个特征(在这种情况下为error: redefinition of 'GetCurrentIp'
),而不是实现(在这种情况下为C
),它们可以帮助您在表达式,因此必须没有实现依赖。和属性(比如你提到的那个,编译器永远不会扩展内联函数的提示)是编译器生成代码所需的指令。实际上,gcc
定义的属性不是语言的特征,因此程序含义不应因包含或排除这些而改变。