我有一些用C编写的代码(专门针对gcc),需要编译为C ++(g ++)。我遇到了一个我很难处理的构造。
在很多地方使用了一些基本上采用常量地址的宏,尽管它们也适用于非常量。结构看起来像这样:
int *iptr = (&(int){5});
这实际上发生的是指定常量,然后可以在需要int指针的函数中使用指向该常量的指针,但只指定了一个常量。也可以在curley括号内指定多个值来构造实际的临时数组。而且效果很好。
问题在于,g ++完全不喜欢这个,抛出
error: non-lvalue in unary `&'
更新:看起来我可以通过执行以下操作来获取C ++中常量的地址:
const int & ref = 5;
所以这是我试图采取的方向的起点。
答案 0 :(得分:0)
以下似乎在C和C ++中都有效,尽管它只在C ++ 11下编译,而不是在C ++ 03下编译。
#ifdef __cplusplus
#define A(type,x) (&(const type &)(type)x)
#define Of(...) { __VA_ARGS__ }
#else
#define A(type,x) (&(type){x})
#define Of(...) __VA_ARGS__
#endif
测试代码:
int test(const void *ptr,int len) {
char *str = (char *)ptr;
int i;
for (i=0;i<len;i++) {
printf("%02X ",str[i]);
}
printf("\n");
return 0;
}
int main() {
test(A(int,5),4);
test(A(x,Of(5,6)),8);
int i=1,j=2;
test(A(x,Of(i,j)),8);
}
编辑:哎呀,不是那里。如果类型是指针,则不起作用!
test(A(char *,9),4);
=&GT;
error: invalid cast of an rvalue expression of type 'char*' to type 'const char*&'
注意:我放弃了这种方法,转而使用不同的方法(将C代码编译为C并通过C ++进行链接),但如果对某人有用,请保留此答案。