嵌入式技术
gcc attribute 关键字用来给 函数、变量、数据类型设置属性
C语言代码里看到__attribute__
这个东西,它就是表示要描述属性了。gcc的通用属性可以参考Common-Function-Attributes。
alias格式
alias ("target")
alias属性可以给target符号起一个别名,两个名字用起来效果一样。
extern 类型 新变量名字 __attribute__((alias("旧变量名字")));
extern 类型 新函数名字(参数) __attribute__((alias("旧函数名字")));
备注:新的函数别名需要和旧函数类型相同,即函数返回值和参数要相同;alias后函数名称只写函数名字即可,无需携带括号和参数。
void __printPath(const char *path)
函数的完整定义,main
函数对其进行了调用,传值为命令行传入的文件路径/home/TEST/BAR/tmp。#include < stdio.h >
#include < stdlib.h >
/* __attribute__((alias()))为函数和变量起别名 */
/* printPath(const char* path)为__printPath(const char* path)的别名 */
extern void printPath(const char* path) __attribute__((alias("__printPath")));
/* Debug()为__myfunc()函数的别名 */
extern void Debug() __attribute__((alias("__myfunc")));
/* date变量为__date变量的别名 */
extern char* date __attribute__((alias("__date")));
/* 定义全局变量__date */
char* __date="2023-01-18";
void __printPath(const char *path)
{
printf("The %s file in the %s folder.\\n", __FILE__, path);
}
void __myfunc()
{
printf("You are calling the function %s in %s file.\\n",__FUNCTION__, __FILE__);
}
void printDate()
{
fprintf(stdout,"Today is:%s\\n", date);
}
int main(int argc, char* argv[])
{
if(argc != 2)
{
printf("Please input the correct parameter, it need a parameter with the file path!\\n");
exit(-1);
}
printf("=========================================================\\n");
printPath(argv[1]);
Debug();
printDate();
printf("=========================================================\\n");
return 0;
}
编译程序,执行结果如下:
[root@localhost tmp]# gcc -o alias alias.c
[root@localhost tmp]# ./alias /home/TEST/BAR/tmp
=========================================================
The alias.c file in the /home/TEST/BAR/tmp folder.
You are calling the function __myfunc in alias.c file.
Today is:2023-01-18
=========================================================
注意 :如果别名目标(target)与别名不在同一个翻译单元中定义,则是一个错误。在没有属性的情况下,GCC假定带有外部链接的不同声明表示不同的对象。在没有声明别名属性的翻译单元中,使用别名和别名目标来访问同一个对象是没有定义的。此属性需要汇编程序和对象文件支持,并且可能不适用于所有目标。
全部0条评论
快来发表一下你的评论吧 !