我有一个宏需要能够接受任意整数或指针类型并将它们转换为unsigned long long
。执行此操作的自然方式只是强制转换,并且可以正常工作,但是使用默认的GCC警告会产生“从指针转换为不同大小的整数”,我想避免这种情况。避免警告的自然方法是使用中间演员,如(unsigned long long)(uintptr_t)x
,但在我的情况下不起作用,因为:
uintptr_t
。0xffffffff
而不是0xffffffffffffffff
。如果我有一个表达式(可能使用?:
运算符)可以区分指针和整数类型,我可以将其分解为两种情况并首先应用(uintptr_t)
强制转换指针输入,但不是整数。关于一个可行的技巧的任何想法?
答案 0 :(得分:1)
这似乎应该有效:
sizeof (1?(x):(unsigned long long)0) < sizeof (unsigned long long)
? (uintptr_t)(x)
: (unsigned long long)(x)
例:
x
具有任何整数类型。然后,1?(x):(unsigned long long)0
的类型为unsigned long long
,因此会采用第二个分支,直接转换为unsigned long long
。x
具有指针类型,指针类型小于unsigned long long
。然后1?(x):(unsigned long long)0
具有原始指针类型,并且第一个分支被执行,通过uintptr_t
。x
具有指针类型,指针类型与unsigned long long
的大小相同(或更大,但我认为不会发生)。然后是第二个分支,但无论如何都没有发出警告。我不清楚GCC是否可以避免发出死代码警告(不会被采取的分支),但如果没有,可能__builtin_choose_expr
是一个解决方案。