什么';这是一个错误使用ARMC编译器选项的示例;枚举容器始终为int;?
在中有一个选项和一个注释: 枚举容器始终为int 选择此选项可强制将所有枚举存储为整数。默认情况下,编译器使用可以保存枚举中所有值的最小数据类型 注意什么';这是一个错误使用ARMC编译器选项的示例;枚举容器始终为int;?,c,arm,compiler-options,C,Arm,Compiler Options,在中有一个选项和一个注释: 枚举容器始终为int 选择此选项可强制将所有枚举存储为整数。默认情况下,编译器使用可以保存枚举中所有值的最小数据类型 注意 一般情况下不建议使用此选项,ANSI兼容源不需要此选项。如果使用不当,此选项可能会导致生成的图像出错 在C语言中,这样一个错误用法的例子是什么 背景: 我正在用C语言开发一个嵌入式应用程序,删除此编译器标志修复了一个错误(或仅修复了另一个错误的症状)。这个错误是一个错误 sprintf(big_enought_char_array, "
一般情况下不建议使用此选项,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
,则您的类型将无法表示它,因为Cenum
保证表示它
关于
sprintf
调用的具体问题,它似乎与此选项完全无关。您可能在调用之前调用了一些未定义的行为。以下是我对sprintf()
的猜测:
您的堆栈实际上被声明为一个char[]
数组,它包含一些enum
变量,或者处于一个\u压缩的结构中。将enum
从char
更改为int
(或以其他方式)更改堆栈变量的对齐方式,从而使浮点对齐。(第三个变量sprintf()
是float
几乎肯定会在堆栈上传递)
ARM要求堆栈对齐8字节。最好将它声明为uint64\u t
(并且绝对不是在\u包装的结构中),这样它的对齐方式总是正确的。为什么它明显地破坏了sprintf?@ringø:Marcus的意思是“显而易见的”,“可以观察到的”,而不是“它站得住脚”。或者不使用sprintf
所有这些:)@TomerW他也不这么认为,这就是为什么他想知道当设置编译器标志时,行为为什么会改变(我猜)@Russ Schultz:exactlyQuestions寻求调试帮助(“为什么这段代码不工作?”)必须包括所需的行为、特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。浮点未连接到枚举。因此,似乎还有另一个影响。