如何动态设置 char*(基于条件)
How to set a char* dynamically (based on a conditional)
我在不使用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++使用不const
的char*
并指向字符串是不推荐使用的。
您还应该将编译器的警告级别提高一个档次:然后它会警告您的第一个代码(即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
。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- C++等效于 C# 的 "?." 空条件运算符
- 条件_variable和unique_lock如何适用于线程安全列表
- 如何避免参数数量依赖于条件的调用分支?
- 如何有效地设计一种方法,使每个条件都依赖于另一个条件
- 将条件应用于整个向量
- 有条件地初始化一个结构体字段——仅当它存在于该结构体中时
- 条件预处理器相对于条件语句的优势
- 设置依赖于调用栈的条件断点
- 有条件地启用子类型(类似于启用函数的enable_if)
- C++:不应用于简单嵌套if-then-else语句的条件
- 计算类似于二项和的条件概率