首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Constexpr函数中的constexpr常量?

Constexpr函数中的constexpr常量?
EN

Stack Overflow用户
提问于 2021-01-15 19:20:55
回答 1查看 63关注 0票数 2

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

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

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

我的意思的一个缩写例子:

代码语言:javascript
复制
#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。

EN

回答 1

Stack Overflow用户

发布于 2021-01-15 19:49:06

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

在main中,您可以将x声明为constexpr,以确保x的值在编译时被赋值。这可能很有用,因为调用常量函数(即使是在传递文字值时)并不能保证它会在编译时被计算。但是有一个问题:您将不能再修改指针(x将成为const char * const,这是指向const char的常量指针)。

Y总是在运行时计算,因此您不能将其声明为constexpr。

我的建议是在godbolt.org中尝试您的代码片段,这样您就可以看到具有不同优化选项的结果

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65735205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档