【问题标题】:Function argument, const char **, Temp Variable函数参数,const char **,临时变量
【发布时间】:2011-06-20 04:44:44
【问题描述】:

我想将一个参数传递给一个函数,该函数需要一个 const char **

#include<iostream>

using namespace std;

void testFunc(const char **test){}

string testString = "This is a test string";

int main()
{
    const char *tempC = testString.c_str();

    testFunc(&tempC);

    return 0;
}

这段代码运行良好,但我不想通过临时变量 tempC。我想直接通过 testString.c_str() 。像下面这样,

int main()
{    
    testFunc(&testString.c_str());

    return 0;
}

但是,它显示错误,

 error C2102: '&' requires l-value

是否可以不使用临时变量来做到这一点。

【问题讨论】:

  • 你不能。为什么你需要char** 而不是char*
  • 它的另一个函数需要**const char ****,我只需要向它发送一些数据。我无法更改原型。
  • @iamcreasy:它有什么作用?它有时会改变 test 的值吗?如何以及为什么?在不知情的情况下,我们可以告诉您您所做的事情有什么问题,但不能告诉您如何做您想做的事情......
  • @Tony 我已经发布了@nicol-bolas 回答的第一条评论的详细信息。 :)
  • @iamcreasy:我已投票结束这个问题,因为我认为您会发现上面的问题出于相同的原因涵盖了相同的主题。基本上,您真正想要调用的 glShaderSource 函数需要一个或多个输入字符串,并接受指向这些字符串的指针数组。您最好编写反映该期望的代码,并让您以后轻松添加更多字符串,即使这意味着需要第二行代码。

标签: c++


【解决方案1】:

我想直接通过 testString.c_str()。

你不能。 std::string::c_str() 返回一个const char *。为了创建一个指向字符串的指针,你必须把它放在一个变量中并获取它的地址。

话虽如此,我更关心的是你试图将它传递给什么函数。一般来说,采用const char ** 的函数有两个原因:

1:它需要一个字符串数组。您正在传递一个字符串。通常,采用数组的 C 风格函数需要第二个参数来说明数组中有多少元素。我希望你把 1 放在那里。

2:返回一个字符串。在这种情况下,您正在做的事情根本没有帮助。您应该创建一个const char * 作为变量,将其初始化为NULL,然后将指向它的指针作为参数传递。它的值将由函数填写。

【讨论】:

  • 确实如此。我正在尝试编写一个将着色器文件作为输入并将其转换为字符串的函数,我将能够将其传递给 glShaderSource 函数。 This tutorial 使用 const char* 来显示它。
  • @iamcreasy 这就是你必须这样做的方式。将 std::string::c_str() 的返回值放入变量中并获取其地址。将 1 传递给 glShaderSource 以获得字符串的数量。
【解决方案2】:

您将需要两个临时变量来调用 glShaderSource,因此您不妨将它们封装在一个直接获取字符串的函数中。

#include <gl.h>
#include <string>

void setShaderFromString(std::string &instr, GLuint shader)
{
        const GLchar *str[1]; // room for one const GLchar *
        GLint   len[1];       // make this an array, for symmetry

        str[0] = instr.c_str();
        len[0] = instr.length();
        glShaderSource(shader, 1, str, len);

}

【讨论】:

  • 长度数组是不必要的。如果您为最后一个参数传递 NULL,那么它将简单地假定字符串是以 NULL 结尾的。这是 c_str 生成的。
  • +1 不错的结构化方法。可以通过 const ref 获取 instr。 @Nicol:听起来很方便,虽然 length() 是 O(1) 并且可能避免了 glShaderSource 中的 O(N) 操作... ;-)。
  • @Nicol - 好吧,没必要,但我们有长度,为什么不避免另一个 strlen。
【解决方案3】:

只是 - 不。

(填充一些空间)

【讨论】:

  • 我不相信这个答案有用。您没有提供原因或解决方案。
  • 嗯,它直接回答了他的问题“是否可能”,并且没有受益于他在其他答案的 cmets 中提供的额外上下文。
  • 确实如此,但它不值得被赞成。我认为您不能将其视为答案。让我们同意在这里不同意好吗?
【解决方案4】:

你也可以进行类型转换:

int main()
{
    testFunc((const char **)&testString);
    return 0;
}

【讨论】:

  • 这假定了一个 STL 实现,其中 testString 的第一个成员恰好是一个 char*。 Gnu libc 就是其中之一。但这不标准: static_cast(&testString) 无效。
  • 它还假设指向的缓冲区保持为 NUL 终止 - 极有可能但 C++03 标准不保证。 Erik 的担忧更实际:实现可能没有“char*”的许多原因 - 小字符串优化、指向引用计数对象的指针、将 size 成员放在首位......总而言之,它真的不是好主意:-/.
  • 谁能给我一个网络参考,我可以在其中了解更多信息。我想知道为什么这不是一个好主意或/和非标准使用。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多