Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是一个错误使用ARMC编译器选项的示例;枚举容器始终为int;?_C_Arm_Compiler Options - Fatal编程技术网

什么';这是一个错误使用ARMC编译器选项的示例;枚举容器始终为int;?

什么';这是一个错误使用ARMC编译器选项的示例;枚举容器始终为int;?,c,arm,compiler-options,C,Arm,Compiler Options,在中有一个选项和一个注释: 枚举容器始终为int 选择此选项可强制将所有枚举存储为整数。默认情况下,编译器使用可以保存枚举中所有值的最小数据类型 注意 一般情况下不建议使用此选项,ANSI兼容源不需要此选项。如果使用不当,此选项可能会导致生成的图像出错 在C语言中,这样一个错误用法的例子是什么 背景: 我正在用C语言开发一个嵌入式应用程序,删除此编译器标志修复了一个错误(或仅修复了另一个错误的症状)。这个错误是一个错误 sprintf(big_enought_char_array, "

在中有一个选项和一个注释:

枚举容器始终为int

选择此选项可强制将所有枚举存储为整数。默认情况下,编译器使用可以保存枚举中所有值的最小数据类型

注意
一般情况下不建议使用此选项,ANSI兼容源不需要此选项。如果使用不当,此选项可能会导致生成的图像出错

在C语言中,这样一个错误用法的例子是什么


背景:

我正在用C语言开发一个嵌入式应用程序,删除此编译器标志修复了一个错误(或仅修复了另一个错误的症状)。这个错误是一个错误

sprintf(big_enought_char_array, "%4.1f", float_var)
函数调用未正确格式化浮点

通过对用作堆栈的内存使用正确的对齐方式,几乎可以解决这一问题。“几乎”已修复,因为数组的内容正常,但小数点的字符错误。删除上面提到的编译器选项修复了这个问题。所以问题是这个编译器选项到底在做什么,它的错误用法是什么

这个编译器选项到底在做什么

通常情况下,您的平均
enum
没有2个条目,在大多数情况下,它甚至没有256个条目。在这种情况下,C编译器通常可以自由地使用较短的值表示形式,例如单个字节


使用该标志将使所有
enum
s占用相同的
int
大小(读取:字长)内存。这只是在几个非常特殊的情况下,显然,它破坏了sprintf;我认为这不是经常发生的事情,所以:您使用的是什么
libc
实现?确保它没有明确禁止使用该标志,并在必要时提交错误报告。制作一个最小的测试用例来演示这个问题。

我假设您指的是这个选项:

枚举容器始终为int

选择此选项可强制将所有枚举存储为整数。默认情况下,编译器使用可以保存枚举中所有值的最小数据类型

在C中,枚举类型使用的类型是实现定义的(但
enum
常量始终是
int
):它是一个整数类型,可以表示所有
enum
常量

如果将枚举类型的类型设置为
int
,我可以想到两个问题:

1) 如果使程序依赖于
enum
int
(例如,假设
sizeof
sizeof(int)
相同),则它在其他系统上不可移植

2) 如果定义的常量的值大于
INT\u MAX
(或者
INT
无法表示),例如
UINT\u MAX
,则您的类型将无法表示它,因为C
enum
保证表示它


关于
sprintf
调用的具体问题,它似乎与此选项完全无关。您可能在调用之前调用了一些未定义的行为。

以下是我对
sprintf()
的猜测:

您的堆栈实际上被声明为一个
char[]
数组,它包含一些
enum
变量,或者处于一个
\u压缩的
结构中。将
enum
char
更改为
int
(或以其他方式)更改堆栈变量的对齐方式,从而使浮点对齐。(第三个变量
sprintf()
float
几乎肯定会在堆栈上传递)


ARM要求堆栈对齐8字节。最好将它声明为
uint64\u t
(并且绝对不是在
\u包装的
结构中),这样它的对齐方式总是正确的。

为什么它明显地破坏了sprintf?@ringø:Marcus的意思是“显而易见的”,“可以观察到的”,而不是“它站得住脚”。或者不使用
sprintf
所有这些:)@TomerW他也不这么认为,这就是为什么他想知道当设置编译器标志时,行为为什么会改变(我猜)@Russ Schultz:exactlyQuestions寻求调试帮助(“为什么这段代码不工作?”)必须包括所需的行为、特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。浮点未连接到枚举。因此,似乎还有另一个影响。