我有一个宏使用GCC的typeof来创建一个相同类型的宏参数的变量.问题是:如果该参数有const类型,则在宏内创建的变量是const,我不能使用它.例如:
#include <stdio.h>
#define DECR(x) ({typeof(x) y; y = x; y--; y;})
int main(void)
{
const int v = 5;
printf("%d\n", DECR(v));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
汇编给出:
$ cc -c -o t.o t.c
t.c: In function 'main':
t.c:9:2: error: assignment of read-only variable 'y'
t.c:9:2: error: decrement of read-only variable 'y'
make: *** [t.o] Error 1
Run Code Online (Sandbox Code Playgroud)
有没有办法复制一个值的类型和un-const呢?
rod*_*igo 10
如果你不介意可能的算术推广,你可以这样做:
#define DECR(x) ({typeof(x + 0) y; y = x; y--; y;})
Run Code Online (Sandbox Code Playgroud)
诀窍是表达式为typeofis x + 0,这是一个r值,因此l-value-constness(这是你想要避免的)会丢失.
可以用同样的技巧完成1 * x,但奇怪的是,+x并且-x不起作用.