C++相当于获取一个常量的地址
C++ equivalent to taking address of a constant?
我有一些用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++链接),但会保留这个答案,以防对某人有用。
相关文章:
- 用C++中的一个变量定义一个常量
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- C++ 在 none 常量指针函数中返回一个常量指针
- 为什么重载"<<"需要一个常量参数?
- 为什么它是一个常量指针而不是指向常量指针
- 是一个常量句柄真的常量
- 将一个常量cstring附加到我自己的String类对象
- C++在类构造函数中定义了一个常量成员变量
- G++抱怨constexpr函数不是一个常量表达式
- 是一个常量字符串Still Preferrable
- 返回一个常量字符 *
- 将一个常量未签名的长流流式传输到流
- 从自定义 printf 函数返回一个常量字符*
- C++做虚函数总是必须是一个常量
- 我想将一个常量字符串写入包含另一个输入数据块的文件
- 如何计算初始化一个常量数组(制作常量查找表)
- C++:在初始化列表中传递一个常量 *p
- 我可以在 protobuf 中定义一个常量字符串吗?
- 初始化一个常量变量,如果失败则断言(c++)