问题标签 [gcc-attribute]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 我应该检查什么预处理器条件才能使用 __attribute__((const))?
我得到了一段适用__attribute__((const))
于某些功能的代码。现在,我宁愿在它可用时不删除它,但另一方面,我确实想要更便携,所以 - 我想说
条件应该是什么?
笔记:
- 我知道,对于 C++17,我们将其作为适当的 C++ 属性;但我不能假设使用了 C++17。事实上,让我们假设这不是为了让事情变得简单。
- 如果你也能回答问题,加分
__attribute__((pure))
。
c++ - 如何创建独立于平台的宏来包装编译器扩展?
我有一些这样的代码需要跨平台:
我想用 Waf 写一个 config.h 包含
如果编译器支持这个扩展,并且
否则,我可以像这样重写函数:
查看配置文档,我没有看到明显的方法来做到这一点。HAS_ATTRIBUTES
如果使用此功能的代码片段无法编译,我能做的最好的事情就是定义一些宏。
waf 是否支持以这种方式配置项目,还是我必须手动编写第二个配置头?
(我正在专门寻找一个 waf 答案。如果我可以使用其他东西,我会的。)
c - __attribute__ 在多个变量的定义中
我有一个问题,最好用例子来解释。请考虑以下代码:
这显然定义了两个类型的变量unsigned char
。
如果我想让变量与 16 字节边界对齐,我的第一个天真的方法是:
我的问题是我不确定编译器是否总是适用__attribute__((aligned(16)))
于这两个变量。
我特别担心,因为以下所有代码都在没有错误或警告的情况下编译:
根据我的研究,__attribute__((aligned(16)))
对上面三行中的各个变量执行相同的操作。但是这种弱语法对于 C 来说是不寻常的,所以我有点不信任。
回到我原来的问题,我知道我可以很容易地避免不确定性,比如
也许
但是我真的很想知道在声明多个都应该具有该属性的变量时添加一次__attribute__
装饰是否足够。
当然,这个问题涉及所有属性(不仅仅是aligned
属性)。
作为一个额外的问题,将这些属性不仅添加到变量定义中,而且添加到变量声明中(例如在头文件中)是否被认为是一种好的风格?
c - 除了第一个之外,所有压缩字段的 C 结构与压缩结构不同吗?
在其通用类型属性中,GCC 提供packed
:
此属性附加到
struct
[...] 类型定义,指定放置其每个成员(除了零宽度位字段)以最小化所需的内存。这 相当于指定packed
每个成员的属性。
此外,根据 C18 标准(§ 6.7.2.1, 15-17):
在结构对象中,非位域成员 [...] 的地址按声明顺序递增。指向结构对象的指针,经过适当转换,指向其初始成员 [...],反之亦然。结构对象内可能有未命名的填充,但不是在其开头。[...] 结构末尾可能有未命名的填充 [...]。
因此,鉴于结构的开头没有填充,packed
在其第一个成员上使用似乎是多余的。反过来(这就是我的问题所在),在除第一个packed
成员之外的所有成员上使用似乎不必要地复杂,并且等同于在结构本身上使用(我们假设所有成员都是整数类型)。packed
但是,我多次遇到类似于以下的代码:
我无法弄清楚为什么作者更喜欢这样的斗争
packed
第一个成员会改变的结构本身的对齐问题吗?它是否来自我没有考虑过的填充和对齐以外的其他东西(例如旧版本的 GCC 中的怪癖)?另一方面,如果它们是等效的,我怎么能确定它,因为文档是恕我直言,在这里没有什么帮助?
虽然这不是它们等效的有效证据,但我尝试struct
为各种架构(x86、x86_64、Aarch64)编译这两个 s,它们似乎总是共享相同的布局。
c - 来自主可执行文件的 GCC 属性 __attribute__ ((constructor)) 在链接库构造函数之后运行
我注意到链接到我的应用程序的共享对象的构造函数将始终在我的应用程序构造函数之前运行,即使我的应用程序具有较低的优先级(即:较高的优先级);例如,假设这个程序:
正在链接以下共享对象:
我预计输出是:
测试
测试所以
相反,输出是相反的。
有什么理由吗?我找不到任何文件。