【问题标题】:What does __devexit mean in a function declaration?__devexit 在函数声明中是什么意思?
【发布时间】:2015-06-20 00:05:16
【问题描述】:

我看过的一个司机有

static void __devexit rtsx_remove(struct pci_dev *pci)

__devexit 在函数定义的上下文中是什么意思?我见过的其他函数最多有static 和一个返回类型。

【问题讨论】:

  • 你为什么不右击那个__devexit符号,去它的定义看看它到底是什么意思???它很可能只是一个注释,用于通过外部工具生成预定义的警告,该工具检查编码正确性或类似的东西。
  • 请注意,您可以有一个函数,例如static inline int max(int x, int y) { return (x > y) ? x : y; },它会在其中添加一个inline。你可以有一个内联函数,它返回一个指向(常量)易失数据的常量指针,以及各种其他东西。你可以有一个static void _Noreturn inline exit_noisily(void) { fprintf(stderr, "Exiting\n"); exit(EXIT_FAILURE); } 等。Microsoft 使用和/或使用各种限定符,例如farnearcdecldllimportdllexport 等(可能带有下划线)。您的 __devexit 是另一个这样的限定词。
  • @barakmanos 我没有使用 IDE

标签: c function


【解决方案1】:

长话短说:

这是一个扩展为一组 gcc 属性的宏。它们是一种向编译器提供有关代码中各种内容的特殊信息的方法,例如,在这种情况下,是一个函数。

不同的编译器为此目的有不同的语法,它没有标准化。例如,gcc 使用属性,但其他编译器使用不同的构造。

长篇大论:

所以,我不是Linux内核专家,但从源代码来看,这个宏用于Hotplug。我相信这意味着该功能应该在特定设备退出时执行某些操作。

例如,您提供的函数似乎来自用于与 Realtek PCI-Express 读卡器驱动程序一起使用的热插拔函数集。

那个宏实际上是做什么的?好吧,让我们仔细看看宏的定义:

#define __devexit        __section(.devexit.text) __exitused __cold

第一部分是__section(.devexit.text):

# define __section(S) __attribute__ ((__section__(#S)))

如您所见,这会创建一个__attribute__(__section__()),其部分名称为".devexit.text"。这意味着 gcc 会将具有此属性的函数的汇编代码编译到已编译二进制文件中名为 .devexit.text 的命名节中(而不是默认节)。

第二部分是__exitused(仅在定义了MODULE宏时才定义):

#define __exitused  __used

__used 的定义取决于 gcc 版本,如下所示:

# define __used                 __attribute__((__used__))

或者像这样:

# define __used                 __attribute__((__unused__))

前者确保具有该属性的函数被编译,即使它没有被任何地方引用。后者在相同的情况下抑制编译器警告,尽管它不会以任何方式影响编译。

最后,__cold:

#define __cold                  __attribute__((__cold__))

这是一个属性,通知编译器具有该属性的函数不会被经常调用,以便它可以进行相应的优化。

Sooo,我们到底有什么?看起来标有__devexit 的函数是只是不经常调用的函数(如果有调用的话),并填充到命名部分中。

所有源代码均取自here。看起来宏现在实际上是removed from the Linux Kernel

【讨论】:

    【解决方案2】:

    "...很可能只是一个注释..." --barak manos

    尤里卡!事实证明,这个神秘元素可能被称为annotation,它添加了有关函数的额外信息。编译器可以检查这些额外信息,以捕获可能被忽视的错误。

    编辑:@MattMcNabb 说这不是注释。增加了不确定性。

    【讨论】:

    • 这可能是很多东西,因为它很可能是一个宏。
    • 如果是the Linux kernel __devexit,那肯定不是“注解”。
    • @Kenkron:请参阅Hans Passant's comment 中的链接 - 它会导致提交,其中简要记录了此宏及其兄弟的用途。
    【解决方案3】:

    这些属性在 Linux 内核中用于某些驱动程序函数和数据声明,将它们放在一个单独的部分中,在某些情况下可能会被丢弃。

    但是,从 3.10.x 开始,它们不再使用(或定义)。见:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多