在C中的以下陈述中哪一个更好用?
static const int var = 5;
Run Code Online (Sandbox Code Playgroud)
要么
#define var 5
Run Code Online (Sandbox Code Playgroud)
要么
enum { var = 5 };
Run Code Online (Sandbox Code Playgroud) 在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Run Code Online (Sandbox Code Playgroud)
在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.
以下定义之间有区别吗?
const double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
Run Code Online (Sandbox Code Playgroud)
如果没有,在C++ 11中首选哪种风格?
在C中的位置MIN和MAX定义,如果有的话?
实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)
我应该在哪里使用宏,哪里更喜欢constexpr?它们基本不一样吗?
#define MAX_HEIGHT 720
Run Code Online (Sandbox Code Playgroud)
VS
constexpr unsigned int max_height = 720;
Run Code Online (Sandbox Code Playgroud) 这编译:
int main() {
const int x = 123;
auto g = []() { std::cout << x << "\n"; };
g();
}
Run Code Online (Sandbox Code Playgroud)
但是这个:
int main(){
const float x = 123;
auto g = []() { std::cout << x << "\n"; };
g();
}
Run Code Online (Sandbox Code Playgroud)
生产:
"错误:'x'未被捕获"
为什么?
我已经在GCC(各种版本从5.0.0到8.0.0)和Clang(各种版本从4.0.0到6.0.0)上测试过它.它在所有情况下都表现相同.
很明显constexpr意味着const,因此常见的是:
constexpr int foo = 42; // no const here
Run Code Online (Sandbox Code Playgroud)
但是,如果你写:
constexpr char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)
然后,如果传递了-Wwrite-string标志,GCC将产生"警告:从字符串常量弃用转换为'char*'".
写作:
constexpr const char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.
那么constexpr const和constexpr真的一样吗?
作为一个通用规则,const_cast<>()在C++代码中使用它通常被认为是一种不好的做法,因为它(大多数情况下)揭示了设计中的一个缺陷.
虽然我完全同意这种说法,但是我不知道什么是例使用const_cast<>()是确定和唯一的解决办法.
你能不能给我一些你认识/遇到过的例子?
非常感谢你.
为什么此代码会返回警告
警告:ISO C++禁止将字符串常量转换为'char*'[ - WRrite-strings]
如果
在对象声明或非静态成员函数中使用的constexpr说明符(直到C++ 14)暗示const.函数或静态成员变量(自C++ 17)声明中使用的constexpr说明符暗示内联.
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
Run Code Online (Sandbox Code Playgroud)
如果我添加一个const后constexpr,警告消失了:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; }; …Run Code Online (Sandbox Code Playgroud) 我对一个constexpr概念感到困惑,因为我读过的constexpr是在编译时进行评估,因此它对于性能优化与正常情况相比非常有用const.
constexpr int i = 0;
constexpr int& ri = i;
Run Code Online (Sandbox Code Playgroud)
上面的代码返回一个错误"从'const int'类型的表达式中无效初始化类型'int&'的引用",为什么?
此外,下一个代码有一个错误:
constexpr int i = 0;
constexpr int* ri = &i;
Run Code Online (Sandbox Code Playgroud)
如果我替换了constexpr关键字const,以上所有都正常工作.