- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为运行 Cortex-M4 架构的 ARM 处理器编写一段代码(具有单精度 float 但不是 double float )。我遇到的问题是在使用可变参数时,编译器试图将我的 float 提升为 double 。有什么办法可以关闭它吗?或者指定不同的促销策略?我查看了 GCC 手册,但找不到任何内容。一个简单的例子是尝试编写您自己的 printf...
void myprintf(const char *fmt, ...) {
// .. parse fmt and come across %f
double dv = va_arg(args, double); // Compiles but doesn't link
float fv = va_arg(args, float); // Doesn't compile (warns about promotion)
}
更新:根据要求,我希望使用的调用命令是 myprintf("%f", 1.0f);
。问题是 Cortex-M4 不支持 double ,所以当 1.0f 提升为 double 时……它不能。所以使用 va_arg(args, double)
读回它会编译但不会链接,因为与 double 相关的各种 __aeabi_
函数不存在。我想做的是禁用 GCC 将 float 提升为 double (如果可能)。
更新:我有一个当前的解决方法,它基本上只接受指向 float 而不是 float 的指针。我仍然想禁用促销,因为这不是一个很好的解决方案。
最佳答案
将可变参数 float
参数转换为 double
不是 gcc 怪癖或附加组件。它是 C 标准所要求的。 §6.5.2.3(函数调用):
- If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type
float
are promoted todouble
. These are called the default argument promotions. …- If the expression that denotes the called function has a type that does include a prototype, the arguments are implicitly converted, as if by assignment, to the types of the corresponding parameters, taking the type of each parameter to be the unqualified version of its declared type. The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments.
Gcc 确实提供了一些与 C 标准不兼容的选项,但绝大多数选项仅在标准不兼容的情况下才添加行为。这种幅度的变化会影响标准调用约定,使编译后的代码与其他编译后的代码(例如库、标准或其他)不兼容。 Gcc 不提供这样的选项。其他编译器可能,但我不知道有哪个编译器可以。
请注意,如果 float
是一个32 位值。 §5.2.4.2.2 中的最低精度要求有效地要求除指数和符号外, double 至少具有 32 位尾数。这比 64 位 IEEE-749 double 提供的精度低很多,但显然比 32 位值提供的精度要高。
编译器当然有可能提供一个选项,其中 double
以不太精确但计算速度更快的格式表示,例如两个 float
,其中尾数不重叠。 (也就是说,指数至少相差尾数的宽度。)至少一个遗留实现 IIRC 使用了该表示或类似的东西,正是因为它允许将单精度硬件用于 double 计算.它还使将 float
转换为 double
变得微不足道;只需要使低位值为 0.0。或者,编译器可以使用 32 位尾数结合 short
指数,这允许使用整数 ALU。
不过,我认为 GCC 也没有提供该替代方案。
关于c - 覆盖 GCC 的可变参数参数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58178731/
我知道 C++ 中的 overriding 是什么。但是,是否存在覆盖?如果有,是什么意思? 谢谢。 最佳答案 在 C++ 术语中,您有 覆盖(与类层次结构中的虚拟方法相关)和 重载(与具有相同名称但
我想捕获位于另一个元素下的元素的鼠标事件。 这是我所拥有的示例:http://jsfiddle.net/KVLkp/13/ 现在我想要的是当鼠标悬停在红色方 block 上时蓝色方 block 有黄色
以下报道 here我尝试创建一个带有重叠散点图的箱线图。 但是当我运行时: In [27]: table1.t_in[table1.duration==6] Out[27]: counter 7
有一个 JS Fiddle here , 你能在不克隆到新对象的情况下替换 e.target 吗? 下面重复了那个 fiddle 的听众; one.addEventListener('click',
首先要解决重复的可能性: 我不是询问 Override 是什么、它的含义或 @Override 在 java 文档注释之外。那是我不是问 /**Some JavaDoc Comment*/ @over
我想要高于定义的数组。它存储点及其坐标。 public static List simpleGraph(List nodes) { int numEdges = nodes.size() *
我在 http://olisan.dk/blog/ 有一个博客- 如您所见,有一个 28 像素的高间隙(边距顶部)...在 style.css 中: margin-top: 0; 也被设置为 marg
Vulkan 句柄是指向 struct 的不透明指针,或者只是无符号的 64 位整数,具体取决于 VK_USE_64_BIT_PTR_DEFINES 的值: #if (VK_USE_64_BI
我正在尝试提供一个行为类似于 DataGridTextColumn 的 DataGrid 列,但在编辑模式下有一个附加按钮。我查看了 DataGridTemplateColumn,但似乎更容易将 Da
使用 Django 1.10 我想在用户名中允许\字符,因为我在使用“django.contrib.auth.middleware.RemoteUserMiddleware”的 Windows 环境中
我正在尝试使用 ffmpeg 将 Logo 放入 rtmp 流中。我的 ffmpeg 版本是 ffmpeg version 4.3.1目前在我的复杂过滤器中,我有: ffmpeg -re -i 'v
是否有用于Firebase 3存储的方法/规则来禁用文件更新或覆盖? 我为数据库找到了data.exists(),但没有为存储找到解决方案。 最佳答案 TL; DR:在Storage Security
我有两个 Docker Compose 文件,docker-compose.yml看起来像这样 version: '2' services: mongo: image: mongo:3.2
我需要覆盖 JPA 中的集合表吗?也许有人有想法 public class nationality{ @Embedded @AttributeOverrides({
嗨,我正在使用 WIX 和下面的代码将文件安装到目录中。 我的应用程序的工作方式是用户可以在该目录中复制他们自己的文件,覆盖他们喜欢的内容
我正在尝试为 Lua 中的字符串实现我自己的长度方法。 我已成功覆盖字符串的 len() 方法,但我不知道如何为 # 运算符执行此操作。 orig_len = string.len function
在Scala 2.10.4中,给出以下类: scala> class Foo { | val x = true | val f = if (x) 100 else 200
我想做上面的事情。 我过去覆盖了许多文件...... block ,模型,助手......但这个让我望而却步。 谁能看到我在这里做错了什么: (我编辑了这段代码......现在包括一些建议......
根据javadoc An instance method in a subclass with the same signature (name, plus the number and the ty
我有一段代码,只要有可用的新数据作为 InputStream 就会生成新数据。每次都覆盖同一个文件。有时文件在写入之前变为 0 kb。 Web 服务会定期读取这些文件。我需要避免文件为 0 字节的情况
我是一名优秀的程序员,十分优秀!