大多数时候,我看到恒定的C字符串定义为:

static char const* MY_CONSTANT = "Hello World";

但是,指针本身不是const。像下面这样更合适吗?
static char const* const MY_CONSTANT = "Hello World";

我认为有2个具有不变全局变量的目标,我认为:
  • 不允许修改字符串
  • 不允许变量指向其他任何位置

  • 我只是假设定义常量字符串时需要这两个目标。

    另一个有趣的事情是,我被允许这样做:
    int main()
    {
        auto MY_CONSTANT = "";
        MY_CONSTANT = "Another String";
    }
    

    这告诉我auto将字符串推导为char const*而不是char const* const

    所以我有两个主要问题:
  • 定义常量c样式字符串的最合适方法是什么(我想常量指针到某个东西,是更笼统的问题吗?)。为什么选择一个?
  • 关于我的auto示例,为什么选择char const*很有意义(因为它是常量的数据数组,而不是指针本身)。我可以将auto推导为char const* const还是可以更改代码以使其成为此类类型?
  • 最佳答案

    好吧,如果它是一个真正的常量,那么constexpr将是C++ 11做到这一点的方法:

    constexpr char const* MY_CONSTANT = "Hello World";
    

    第一个例子:
    static char const* MY_CONSTANT = "Hello World";
    

    只是说我有一个指向具有静态存储持续时间的char const的指针,如果该指针位于函数之外,则会使其成为全局变量。

    如果我们要求指针也必须是const,那么我们需要您介绍的第二种形式。这完全取决于指针是否确实应该为const。在大多数情况下,您看到没有顶级const的代码的原因是因为他们只是忘记将其放入而不是因为它们并不意味着也要成为const的指针。

    例如,如果要让const成员按实例或按类,则static会有所作为:
    class A
    {
            char const* const const_per_instance = "Other Const String";
        public:
            constexpr static char const* const const_per_class = "Hello World" ;
    };
    

    如果我们要求const是按类的,那么我们就需要使用static,否则就不要使用。如果不允许使用constexpr,该示例将稍作更改:
    class A
    {
            char const* const const_per_instance = "Other Const String";
        public:
            static char const* const const_per_class  ;
    };
    
    char const* const A::const_per_class = "Hello World" ;
    

    但是本质是相同的,只是语法不同。

    对于您的第二个问题(Gotw #92说自动删除顶级const),给出的一个示例如下:
    const int   ci  = val;
    auto        g   = ci;
    

    它说:



    所引用的示例如下:
    int         val = 0;
    //..
    const auto  c   = val;
    

    关于c++ - 在C++中定义常量C字符串的正确方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26111271/

    10-11 23:14
    查看更多