1
我有一个宏需要能够接受任意整数或指针类型并将它们转换为unsigned long long
。这样做的自然方法就是投射,而且工作正常,但是默认的GCC警告会产生“从指针投射到不同大小的整数”,我想避免这种情况。自然的方式,以避免该警告是中间投,作为(unsigned long long)(uintptr_t)x
,但是,这并不在我的情况下工作,因为:替代(无符号long long)强制转换无警告
- 它将截断,不适合在
uintptr_t
整数输入。 - 它会中断符号输入的正确转换,例如, -1可能会变成
0xffffffff
而不是0xffffffffffffffff
。
如果我有一个表达式(也许是做别致的使用?:
运营商的),可以从整数类型区分指针,我可以把它分成两种情况,并首先应用(uintptr_t)
塑像为指针输入,而不是整数。任何想法都可以运作?
(真的很可怕,只为了疯狂):'_Generic'每种整数类型都有大小写。 –
@StephenCanon:公平地说,通过应用执行整数升级的操作,可以使这一点变得更加可怕,但这对于应用于指针也是安全的,从而排除了所有比“int”更低级别的操作。 '1?x:0'应该可以工作。 –
甚至更好:应用'1?x:(uintmax_t)0',为'_Generic'的目的强制任何整数类型为'uintmax_t',同时保持指针类型不变。不幸的是,这仍然需要C11的支持,这并不普遍。 –