在libfixmath数学中有以下宏魔术
#define F16C(i, m) \
( (fix16_t) \
( \
(( #i[0] ) == '-') \
? -FIXMATH_COMBINE_I_M((unsigned)( ( (i) * -1) ), m) \
: FIXMATH_COMBINE_I_M((unsigned)i, m) \
) \
)它被这样使用了几十次:
F16C(3,1415)初始化各种事物,从结构到数组和临时对象。
在ARMCC工作得很好。但是我要迁移到ARM GCC,在那里它给了我以下的错误,但不是在所有的情况下,主要是在做构造初始化。
error: initializer element is not constant这与使用非常量作为初始化程序有关。这是可以理解的
但是这个宏给出了两个整数字面值。再没有比这更稳定的了!
我是不是漏掉了什么,或者是不是有GCC的延伸,我不知道该做什么?
更新:在sizeof(#token)中有一个调用的宏。。
注意:与ARMCC相比,GCC正确地解析了F16()宏,并且没有创建fplib调用。只是提醒那些发现他们自己在未来的问题。
发布于 2020-11-16 12:37:26
根据哥德波特的说法,它是gcc 8.2作品,但在7.3中失败。
但是,如果将( #i[0] ) == '-')替换为(i) < 0,那么它在较低的版本中工作。
我觉得奇怪的是,这个库的作者选择使用( #i[0] ) == '-')来测试宏参数是否为负值,因为如果参数不是整数文本,它就会失败。
(Update)根据OP的评论,不能使用(i) < 0的原因是它也需要将-0归类为负面的。
下面是GCC的一些不同的方法:
// 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或更高版本上创建编译时常数。
https://stackoverflow.com/questions/64857880
复制相似问题