gpt4 book ai didi

c - pragma weak 的支持有多广泛,它是否克服了使用 gcc 属性的问题?

转载 作者:太空狗 更新时间:2023-10-29 17:24:30 24 4
gpt4 key购买 nike

我刚刚在 GCC 中发现了 #pragma weak 指令:

6.57.9 Weak Pragmas

For compatibility with SVR4, GCC supports a set of #pragma directives for declaring symbols to be weak, and defining weak aliases.

#pragma weak symbol

This pragma declares symbol to be weak, as if the declaration had the attribute of the same name. The pragma may appear before or after the declaration of symbol. It is not an error for symbol to never be defined at all.

#pragma weak symbol1 = symbol2

This pragma declares symbol1 to be a weak alias of symbol2. It is an error if symbol2 is not defined in the current translation unit.

http://gcc.gnu.org/onlinedocs/gcc/Weak-Pragmas.html

尽管 GCC 开发人员通常不喜欢 #pragma 并鼓励您使用 __attribute__ 来代替各种可能是 pragma 的东西,但我我倾向于相信 #pragma weak 实际上可能优于基于属性的方法,它看起来像:

extern __typeof(old_name) new_name __attribute__(weak, alias("old_name"))

除了需要 __typeof(或者要求你知道类型并明确拼写出来,即使它是一个非常复杂的函数类型)的丑陋之外,基于属性的方法的最大问题是"old_name" 必须传递给 gcc 作为字符串 才能按字面意义粘贴到生成的程序集中。这是有问题的,因为不同的系统具有不同的名称修改特征(最流行的是在所有 C 符号名称上加上下划线前缀,或者什么都不做),并且要将正确的字符串传递给 alias 属性,您需要知道您正在为其构建的系统的名称修改约定,这实际上不属于弱别名可能有用的应用程序级库中的知识。

语法 #pragma weak new_name = old_name 似乎通过在编译器级别处理两个名称来避免这个问题,除非我弄错了,否则 t 可以适本地破坏它们。

所以在完成所有准备工作后,我的实际问题是:我是否误解了 #pragma weak 具有这种“可移植性”优势?并且是否所有现代类 unix 系统上的编译器(gcc、pcc、tinycc、icc、llvm/clang 等)仍然支持传统的 SVR4 #pragma weak?

我知道以下类似的问题,但它似乎并不完全相同,并且不能令人满意地解决我的问题的答案:

How portable is weak linking? #pragma weak my_symbol

最佳答案

“#pragma weak”和 __attribute__ 都不是 C 标准的一部分,因此严格来说,它们都不是可移植的。一些 C 编译器努力与 GCC 对 C 标准的大部分扩展兼容,而其他编译器则不兼容。

一般来说,如果您已经达到谈论弱符号和弱别名的水平,那么您可能已经过了可以编写可跨编译器可靠移植的代码的阶段。甚至您的工具链也会在这里成为一个问题(尤其是链接器)——我认为如果不经过仔细测试,您就不能依赖任何东西。

编辑添加:原始发帖人在下面评论说,从实用的角度来看,#pragma 的可移植性是否不亚于 __attribute__。

我自己的经验是这样的:能够将所有此类内容隐藏在宏或其他生成的代码中以简化可移植性是件好事。 __attribute__ 更容易隐藏在可移植性头文件中。例如,至少有一个 BSD 内核有一个 cdefs.h,它在宏内部使用 __attribute__ 来集中整个代码库中完成弱定义的方式,以便更容易地更改新编译器。 #pragma 更难以这种方式使用。这样的宏还可以通过使用 CPP 粘贴运算符(“##”等)来隐藏各种名称修改之间的差异

有关此类用法的示例,请参阅: http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/cdefs.h?rev=1.89.6.1&content-type=text/x-cvsweb-markup

关于c - pragma weak 的支持有多广泛,它是否克服了使用 gcc 属性的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9424606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com