C ++相当于获取常量的地址?

时间:2013-02-19 04:02:30

标签: c++ g++

我有一些用C编写的代码(专门针对gcc),需要编译为C ++(g ++)。我遇到了一个我很难处理的构造。

在很多地方使用了一些基本上采用常量地址的宏,尽管它们也适用于非常量。结构看起来像这样:

int *iptr = (&(int){5});

这实际上发生的是指定常量,然后可以在需要int指针的函数中使用指向该常量的指针,但只指定了一个常量。也可以在curley括号内指定多个值来构造实际的临时数组。而且效果很好。

问题在于,g ++完全不喜欢这个,抛出

error: non-lvalue in unary `&'

更新:看起来我可以通过执行以下操作来获取C ++中常量的地址:

const int & ref = 5;

所以这是我试图采取的方向的起点。

1 个答案:

答案 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 ++进行链接),但如果对某人有用,请保留此答案。