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

C++ equivalent to taking address of a constant?

本文关键字:一个 常量 地址 相当于 获取 C++      更新时间:2023-10-16

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

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

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

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

问题是,g++根本不喜欢这样,抛出

error: non-lvalue in unary `&'

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

const int & ref = 5;

所以,这就是我努力走向的起点。

以下内容似乎在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++链接),但会保留这个答案,以防对某人有用。