c++ - Linux 内核中的 C func 签名 : include/linux/sched. h

标签 c++ c function

再次在 linux 内核中发现了那些神秘的函数定义。该函数的签名如下:

static void __sched __schedule(void)

现在它有 void__sched 作为返回类型。有人可以解释一下这些标识符在那里做什么吗?它不应该是 void__sched` 吗?怎么可能两者兼而有之?

这是 __sched 的定义:

 #define __sched    __attribute__((__section__(".sched.text")))

最佳答案

void 是标准的 C 类型,表示该函数不返回结果。

__sched 是一个根据您引用的定义展开的宏,使声明等同于:

static void __attribute__((__section__(".sched.text"))) __schedule(void)

__attribute__ 是 gcc(以及与 gcc 兼容的编译器)支持的语言扩展。其含义记录在 gcc manual 中。 .它指定为函数生成的代码应放在目标文件的指定部分。

因为 __sched,或者说它扩展到的序列,不是类型名称,所以它和 void 之间没有冲突。

(__attribute__语法中的双括号允许像这样的宏定义

#define __attribute__(arg)

如果您想使用不支持该扩展的编译器编译代码,则使用该代码,导致它被忽略而不是被视为语法错误。有些属性有多个参数;将整个参数列表包裹在一组额外的括号中,就预处理器而言,可以将整个列表视为单个参数。)

关于c++ - Linux 内核中的 C func 签名 : include/linux/sched. h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21493174/

相关文章:

c - NULL 不初始化

java - 如何在 Java 中制作动态方法的 hashmap

python - 选择性 python 字符串替换

表达式中的 C++ 运算符重载

c++ - 买卖迷你模拟器

c - 指针指向不同的数据类型

javascript - 使用 toISOString() 和 JSON.stringify() 将日期转换为字符串之间的区别

c++ - 更改成员变量顺序时出现堆损坏

c++ - 堆栈溢出与段错误

c - C 中使用指针的 for 循环声明