使用以下代码,

#define REINT(T, X) (union {__typeof__(X) x; T t;}){X}.t

int f2i(float x) {
  return REINT(int, x);
}

float i2f(int x) {
  return REINT(float, x);
}

float f2i2f(float x) {
  return REINT(float, REINT(int, x));
}

Clang抱怨大约f2i2f个"初始值设定项元素不是编译时常量".这似乎很奇怪,因为复合文字"具有与

推荐答案

在问题下方的 comments 中,提到这是一个已知的bug,"it is quite an old bug still not fixed".因此,在修复之前,您必须解决它.

我能找到的触发bug的最简单代码是

int x = 3.0;
struct { __typeof__((int){x}) y; };

在以下情况下会触发错误:

  • 具有非常量初始值设定项的复合文字
  • __typeof__的参数中使用
  • structunion中的成员变量声明中

f2ii2f函数中使用REINT宏时,不会触发错误,因为参数X不是复合文字.X在这些函数中是一个具有基元类型的变量.

但在f2i2f函数中,传递给REINTouter调用的参数X包含一个复合文字.这个复合文字是__typeof__参数的一部分,__typeof__用于outer union的定义.

因此,解决方法是避免嵌套REINT宏.例如,f2i2f可以如下实现:

float f2i2f(float x) {
    int temp = REINT(int, x);
    return REINT(float, temp);
}

C++相关问答推荐

为什么这个C程序代码会产生以下结果?

减法运算结果的平方的最快方法?

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

LONG_DOUBLE_T是否存在(标准C:C23)

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

为什么我会收到释放后堆使用错误?

S的这种管道实施有什么问题吗?

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

S在本文中的价值观到底出了什么问题?

在C++中父进程和子进程中的TAILQ队列同步问题

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

不同原型的危险C函数是可能的

覆盖读取函数,但当文件描述符为3或4时,我有问题

如何将两个uint32_t值交织成一个uint64_t?

C中的数组下标和指针算法给出了不同的结果

可以对两种 struct 类型中的任何一种进行操作的C函数

在我的函数中实现va_arg的问题

将char*数组深度复制到 struct 中?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据