【问题标题】:C func signature inside Linux Kernel: include/linux/sched.hLinux 内核中的 C func 签名:include/linux/sched.h
【发布时间】:2014-02-01 01:53:08
【问题描述】:

再次在 linux 内核中找到了一次那些神秘的函数定义。该函数的签名为:

static void __sched __schedule(void)

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

这是__sched的定义:

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

【问题讨论】:

  • __attribute____section__ 都被 gcc documentation 覆盖。这是“把我放在这里”之类的东西。此外,"gcc __atttribute__ __section__" 的热门搜索 google 将几乎准确地告诉你你在问什么。
  • 如果您使用c++,请务必使用extern "C" {}进行声明!
  • 您是否正在编写在内核中运行的 C++ 代码?

标签: c++ c function


【解决方案1】:

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

__sched 是根据您引用的定义扩展的宏,使声明等效于:

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

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

由于__sched,或者更确切地说,它扩展为的序列不是类型名称,因此它与void 之间没有冲突。

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

#define __attribute__(arg)

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

【讨论】:

  • 非常全面的答案,谢谢。但是最后几行当你说“如果你想用不支持该扩展名的编译器编译代码时使用,导致它被忽略而不是被视为语法错误,你的意思是什么。” - 什么你指的是扩展名吗? ---谢谢
  • __attribute__ 是一种语言扩展,受 gcc 支持,但并非所有其他编译器都支持。对于不支持它的编译器,__attribute__((...)) 是一个语法错误。我指出双括号语法为使用非 gcc 编译器编译 gcc 特定代码提供了一种解决方法。这与您的问题并不特别相关(Linux 内核无法使用非 gcc 兼容的编译器进行编译)。
猜你喜欢
  • 2012-12-23
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多