【发布时间】:2017-06-19 04:09:04
【问题描述】:
基本上我想知道是否像
f(const void* a){
// This is also what `(char**) a` would do behind the scenes
char** string_a_ptr {reinterpret_cast<char**>(const_cast<void*>(a))};
// ...
在保留const 限定符的情况下是可能的。
我的问题是在关于 C++ 中的 C 数组的练习中提出的。由于 C,我必须传递带有 const void* 参数的函数指针。在这种情况下,它指向一个 C 字符串数组。要将其转换为正确的类型,我必须将 const 丢弃。 C++ 中有没有办法获得类似“(const char*)*”的指针?
我已经尝试了 const char**(没有 const_cast),它产生了
从“const void*”类型到“const char**”类型的重新解释转换抛弃了限定符
和(const*)*,它给出了一个语法错误
“(”标记之前的预期类型说明符
这是一个纯粹的学术问题。我知道,使用std::string 和#include <algorithm> 可以更轻松、更省钱地解决问题。
当我这样做时,有时在 C++ 中使用 C 构造是否有优势,或者是否应该尽可能避免使用它们?我只用 C++ 中的 C 代码做了一些小规模的练习题,但它已经引起了相当多的头痛,并迫使我仔细研究引擎盖下的内容,即使我已经编写了相当多的 C 代码。
还是您更愿意推荐使用extern C 限定符并用纯C 编写C 代码?
【问题讨论】:
-
const void*将是char* const*。 (如果您始终如一地定位const限定符,则更明显:void const*。) -
我明白了。将其重写为
void const*正是解决我的困惑的方法。谢谢! -
"有时在 C++ 中使用 C 构造是否有优势" 是的。但是您应该始终尽量避免它们,并了解 C 构造在可读性、类型正确性或可维护性方面花费了多少。如果是
void*,这三个你都输了。
标签: c++ type-conversion constants extern-c