0

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

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

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

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

问题在,g ++根本不喜欢这个,抛出

error: non-lvalue in unary `&'

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

const int & ref = 5;

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

4

1 回答 1

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); 

=>

error: invalid cast of an rvalue expression of type 'char*' to type 'const char*&'

注意:我放弃了这种方法,转而采用不同的方法(将 C 代码编译为 C 并通过 C++ 链接它),但会保留这个答案,以防它对某人有用。

于 2013-02-19T17:34:00.797 回答