将std::string传递给指向C字符串参数的指针(C++)

3

我正在使用来自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表达式,但那样并不起作用。


糟糕,这是一个重复。 - Lightness Races in Orbit
2个回答

6

不,没有绕过它的方法。

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

但这并不是真正的问题,因为在最终的例子中,你所做的只是分配一个指向指针的指针。这非常便宜和简单。

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


0
我认为问题是:为什么该函数需要一个指向指针的指针?在许多情况下,使用C风格函数时,它们提供这种接口是因为它们想修改目标指针以指向其他内容(例如由函数内部创建的内容)。如果是这种情况,则将string::c_str()的结果分配给变量,然后传递进去有点毫无意义,因为它最终会被重新分配指向其他内容。

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


从问题中可以看出,"one of the parameters is of type const GLchar* const*"。如果您查找该函数,您会发现这是因为它期望一个指向字符串的指针数组。 - Lightness Races in Orbit
也就是说,如果你查看了文档,你就会发现这个答案根本没有回答问题。 :) - Lightness Races in Orbit
但是稍等一下,@LightnessRacesinOrbit。在你的评论之后,我确实查看了文档,它显示我是完全正确的。正如我所怀疑的那样,该参数实际上是一个输出参数(请参见此处)。我的答案有什么问题吗? - Smeeheey
请问文档的哪一部分说明这是一个输出参数? - Lightness Races in Orbit
它的一部分似乎存在于我的想象中。 - Smeeheey
最后,我们达成了一致。 :) - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接