是否有可能在gcc纯C中使用un const typeof?

Pen*_*enz 13 c macros gcc

我有一个宏使用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不起作用.

  • @aaronman:不仅是整数类型。也是浮点数和指针。 (2认同)