代码之家  ›  专栏  ›  技术社区  ›  Startec

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

c++
  •  -1
  • Startec  · 技术社区  · 8 年前

    我试图在C++中不使用 std::string . 这是我试图使用的代码,我不想使用任何不推荐的未来。

    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;
        }
    }
    

    我读过 here 在C++中使用 char* 没有 const 不推荐指向字符串。

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

    但是,如果我声明 const char* error 在任何情况下,我都会在调用 std:cerr 上面说 error: Identifier "error" is not defined

    be有没有办法有条件地设置 error 或者让调用std::cerr时可见?

    编辑: 我喜欢退回 const char* 然而,这需要从内部调用另一个函数 check_gl_error 打印结果。我希望避免这一步。

    3 回复  |  直到 8 年前
        1
  •  6
  •   Bathsheba    8 年前

    “在C++中,char*已被弃用”-这是一个需要破除的神话。字符串文字是 const char[] 输入C++,然后 衰变 到a const char* 在许多情况下。

    重构到 作用 绝对可以:

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

    为避免疑问,字符串文字 长度必须相同。

        2
  •  2
  •   Chris Dodd    8 年前

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

    移动声明 错误 while循环外部(之前)。

        3
  •  1
  •   Yashas πάντα ῥεῖ    8 年前
    const char* errors[] = {
        "Case one",
        "Case two"
    };
    std::cerr << errors[err - 1];
    

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

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