首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC给出的初始值元素不是常数,ARMCC不不变。

GCC给出的初始值元素不是常数,ARMCC不不变。
EN

Stack Overflow用户
提问于 2020-11-16 12:16:06
回答 1查看 94关注 0票数 1

在libfixmath数学中有以下宏魔术

代码语言:javascript
复制
#define F16C(i, m) \
( (fix16_t) \
    ( \
      (( #i[0] ) == '-') \
        ? -FIXMATH_COMBINE_I_M((unsigned)( ( (i) * -1) ), m) \
        : FIXMATH_COMBINE_I_M((unsigned)i, m) \
    ) \
)

它被这样使用了几十次:

代码语言:javascript
复制
F16C(3,1415)

初始化各种事物,从结构到数组和临时对象。

在ARMCC工作得很好。但是我要迁移到ARM GCC,在那里它给了我以下的错误,但不是在所有的情况下,主要是在做构造初始化。

代码语言:javascript
复制
error: initializer element is not constant

这与使用非常量作为初始化程序有关。这是可以理解的

但是这个宏给出了两个整数字面值。再没有比这更稳定的了!

我是不是漏掉了什么,或者是不是有GCC的延伸,我不知道该做什么?

更新:在sizeof(#token)中有一个调用的宏。

注意:与ARMCC相比,GCC正确地解析了F16()宏,并且没有创建fplib调用。只是提醒那些发现他们自己在未来的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 12:37:26

根据哥德波特的说法,它是gcc 8.2作品,但在7.3中失败。

但是,如果将( #i[0] ) == '-')替换为(i) < 0,那么它在较低的版本中工作。

我觉得奇怪的是,这个库的作者选择使用( #i[0] ) == '-')来测试宏参数是否为负值,因为如果参数不是整数文本,它就会失败。

(Update)根据OP的评论,不能使用(i) < 0的原因是它也需要将-0归类为负面的。

下面是GCC的一些不同的方法:

代码语言:javascript
复制
// does not work on gcc
#define IS_NEG(x) ((#x)[0] == '-')

// works, but fails the "-0" case
#define IS_NEG(x) (x < 0)

// works on gcc (although, it matches '-' at any idx)
#include <string.h>
#define IS_NEG(x) (strchr(#x, '-') != NULL)

奇怪的是,使用strchr 似乎是允许的在gcc 5.4或更高版本上创建编译时常数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64857880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档