【问题标题】:Constexpr constants inside a constexpr function?constexpr 函数中的 constexpr 常量?
【发布时间】:2021-04-20 10:19:13
【问题描述】:

假设我有一个静态函数,它接受一个枚举并返回一个 cstring ptr 用于调试。

该函数可以是 constexpr,但不能保证它总是可以在编译时进行评估。假设它在微控制器上运行,这是来自蓝牙堆栈的信号事件;例如设备连接、断开连接、数据输入等,用于上下文。所以参数在编译时不一定是已知的。

将 cstrings 也定义为 constexpr 与不定义是否有任何价值、意义或区别?

我的意思的一个简明例子:

#include <cstdio>

enum myEnum
{
    EVENT1,
    EVENT2,
    EVENT3
};

static constexpr const char* foo(const myEnum i)
{
    // Does having these as constexpr change anything?
    /*constexpr*/ const char* text1 = "Text1";
    /*constexpr*/ const char* text2 = "Text2";
    /*constexpr*/ const char* text3 = "Text3";
    /*constexpr*/ const char* textUndef = "TextUndef";

    switch (i)
    {
    case EVENT1:
        return text1;
    case EVENT2:
        return text2;
    case EVENT3:
        return text3;
    default:
        return textUndef;
    }
}

int main()
{
    const char* x = foo(EVENT1);
    const char* y = foo(/*some value only known at runtime*/);

    printf(x);
    printf(y);

    return 1;
}

我正在使用 gcc 为嵌入式微控制器编译 cpp17。通常使用 -Og 或 -Os。

【问题讨论】:

  • 离题:仅供参考this might be fun to use.
  • 看起来很有趣是啊。虽然有很多 std lib 的东西,所以我不会将它用于可部署的代码。
  • 另一个问题是使用特定于编译器的 hack 来进行反射,这作为一个练习令人印象深刻,但我不想在任何产品中依赖它。

标签: c++ constexpr constexpr-function


【解决方案1】:

在 foo() 中将变量 const char* 声明为 constexpr 不会增加任何价值,因为您没有在函数内利用它们的 constexpr-ness。

在 main 中,您可以将 x 声明为 constexpr 以确保 x 的值是在编译时分配的。这可能很有用,因为调用 constexpr 函数(即使在传递文字值时)并不能保证它将在编译时进行评估。但是有一个问题:您将无法再修改指针(x 将变为 const char *const,即指向 const char 的 const 指针)。

y 总是在运行时计算,所以你不能将它声明为 constexpr。

我的建议是在 godbolt.org 中尝试你的 sn-ps,这样你就可以看到不同优化选项的结果

【讨论】:

  • 谢谢。 foo() 中的变量被声明为 constexpr 有什么本质上的错误吗?除了可能令人困惑/误导之外?注意到 ptr 是 const,实际上这很好。谢谢
  • @GreenaGiant 我没看错。没用的
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2016-07-29
  • 2018-01-08
相关资源
最近更新 更多