头文件中的constexpr const char *

时间:2019-02-26 18:03:19

标签: c++ c++11

是否有理由在头文件中不使用“ constexpr const char *”?

一位同事的论点是,包括该头文件的每个翻译单元都会有一个副本。

我的理解是,由于其编译时常量,因此未分配任何内存,并且在内存使用方面更像是“ #define”宏。 这是来源,

TestConstExpr.h

  #include <string.h>
  namespace TestConstExpr
  {
    constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
    constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;

    class TestClass
    {
        char arr[TIME_FORMAT_SIZE];
    }
  }

1 个答案:

答案 0 :(得分:4)

  

一位同事的论点是,包括该头文件的每个翻译单元都会有一个副本。

您的同事在技术上是正确的。但这并不重要,因为当单元链接在一起时,多余的副本就会被丢弃。

尽管如此,我已经看到一些评论,涉及动态链接时,在某些不符合标准的系统上不一定是这种情况。


constexpr const char* TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
.... sizeof(TIME_FORMAT)

这与您可能认为的不一样。它为您提供了指针的大小,而不是指向的字符串的大小。

constexpr const int TIME_FORMAT_SIZE = strlen(TIME_FORMAT) + 1;

您尝试的修复也不起作用,因为strlen不是常量表达式。

您可以通过使用对字符串文字的引用来解决问题:

static constexpr auto& TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
constexpr const int TIME_FORMAT_SIZE = sizeof(TIME_FORMAT);