【问题标题】:C++ Passing std::string into Pointer-to-C-String Parameter [duplicate]C ++将std :: string传递给指向C字符串的指针参数[重复]
【发布时间】:2016-06-30 14:36:18
【问题描述】:

我正在使用来自 SDL 的函数,其中一个参数的类型为 const GLchar* const*,因此为了调用它,我需要传入一个 C 字符串的引用,如下所示:

const char *str = "test";
glShaderSource(... , &str, ...);

但是,我有一个 std::string 想要传入,并且执行这样的操作会报错:

std::string str = "test";
glShaderSource(... , &str.c_str(), ...);

我知道我可以简单地创建一个新的const char* 变量并将std::string 保存到其中,如下所示:

const char *cstr = str.c_str();

但是有没有办法解决这个问题?我不喜欢创建一个新变量。我尝试使用 lambda,但没有奏效。

【问题讨论】:

  • 糟糕,这是个骗子。

标签: c++ sdl


【解决方案1】:

不,没有办法。

函数glShaderSource 需要一个指向字符缓冲区指针的指针(因为它希望你传递一个或多个 C 字符串),而你不能获取一个右值(这就是 str.c_str() 的表达式)。

但这并不是真正的问题,因为在最后一个示例中,您所做的只是将指针分配给指针。这是非常便宜和容易的。

不要害怕“创建一个新变量”——无论如何命名都是好的。

【讨论】:

    【解决方案2】:

    我认为问题是:为什么函数需要指向指针的指针?在很多 c 风格函数的情况下,它们提供这种接口是因为它们想要修改目标指针以指向其他东西(例如由函数内部创建的东西)。如果是这种情况,那么将string::c_str() 的结果分配给一个变量然后将其传入是毫无意义的,因为无论如何它都会被重新分配以指向其他东西。

    我建议您更彻底地检查此函数的文档,以确保不是这种情况(它可能是)。

    【讨论】:

    • 来自问题:“其中一个参数的类型为const GLchar* const*。如果您查看该函数,您会发现这是因为它需要一个 array 指针到字符串。
    • 也就是说,如果检查了文档,那么你会发现这个答案根本没有解决这个问题。 :)
    • 但请稍等一下@LightnessRacesinOrbit。在您发表评论后,我确实检查了文档,它表明我完全正确。正如我所怀疑的那样,参数 is 实际上是一个输出参数(参见here)。我的回答有什么问题?
    • 对不起,该文档的哪一部分说这是一个输出参数?
    • 我想象中的那一点,似乎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多