如何动态设置 char*(基于条件)

How to set a char* dynamically (based on a conditional)

本文关键字:于条件 条件 设置 何动态 动态 char      更新时间:2023-10-16

我在不使用std::string的情况下尝试在C++中执行以下操作。这是我尝试使用的代码,我不想使用任何已弃用的未来。

void Application::_check_gl_error(const char* file, int line)
{
GLenum err(glGetError());
while (err != GL_NO_ERROR) {
char* error;
switch (err) {
case GL_INVALID_OPERATION: 
error = "INVALID_OPERATION";
break;
}
std::cerr << "Error: " << err << " GL_" << error << " - " << file << ":" << line << std::endl;
}
}

我在这里读到,C++使用不constchar*并指向字符串是不推荐使用的。

您还应该将编译器的警告级别提高一个档次:然后它会警告您的第一个代码(即char* str = "name")是合法的,但已弃用。

但是,如果我在每种情况下都声明const char* error,则在调用std:cerr时会出现错误,指出error: Identifier "error" is not defined

有没有办法让 be 有条件地在此处设置error的值或使其对调用 std::cerr 可见?

编辑:我喜欢返回const char*的想法,但是,这需要从check_gl_error内部调用另一个函数来打印结果。 我希望避免这一步骤。

"In C++ char* 被弃用" - 这是一个需要打破的神话。字符串文本是 C++ 中的const char[]类型,在许多情况下会衰减const char*

重构为函数绝对没问题:

const char* error(int err){
switch (err){
case 1:
return "Case one";
case 2:
return "Case two";
}
return nullptr;
}

为免生疑问,字符串文字不需要具有相同的长度。

问题与char *无关 - 问题是error在嵌套块中被定义为本地的,因此当您尝试使用它时,它不再在该块之后的范围内。

error的声明移到 while 循环之外(之前)。

const char* errors[] = {
"Case one",
"Case two"
};
std::cerr << errors[err - 1];

如果您的错误号不连续并且您有很多错误号,则可以使用std::unordered_map.您平均获得 O(1) 访问时间。

如果错误代码很少,并且错误号不连续,则使用二进制搜索std::vector可能会执行得更好。你会得到 O(log n) 复杂性,但它击败了n的小值的unordered_map