Linux内核关键字讲解_看热讯

2023-06-08 11:15:59 来源:Linux二进制


(资料图片)

gcc attribute关键字用来给 函数、变量、数据类型设置属性

属性

C语言代码里看到__attribute__这个东西,它就是表示要描述属性了。gcc的通用属性可以参考Common-Function-Attributes。

alias

alias格式

alias ("target")

alias属性可以给target符号起一个别名,两个名字用起来效果一样。

1、attributealias变量格式

extern 类型 新变量名字 __attribute__((alias("旧变量名字")));

2、attributealias函数格式

extern 类型 新函数名字(参数) __attribute__((alias("旧函数名字")));

备注:新的函数别名需要和旧函数类型相同,即函数返回值和参数要相同;alias后函数名称只写函数名字即可,无需携带括号和参数。

代码演示

代码中有一个void __printPath(const char *path)函数的完整定义,main函数对其进行了调用,传值为命令行传入的文件路径/home/TEST/BAR/tmp。printPath是一个新名字,它和__printPath是等价的,即它是__printPath的别名。注意因为__printPath带参数,所以printPath必须带参数,且类型需和__printPath一致。Debug是一个新名字,它和__myfunc是等价的,即它是__myfunc的别名。date是一个变量别名,与__date等价。 注意这里只能给全局变量起别名
#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假定带有外部链接的不同声明表示不同的对象。在没有声明别名属性的翻译单元中,使用别名和别名目标来访问同一个对象是没有定义的。此属性需要汇编程序和对象文件支持,并且可能不适用于所有目标。

标签:

上一篇:天天视讯!PCB芯片散热焊盘如何设计?
下一篇:最后一页