【发布时间】:2018-10-18 23:32:32
【问题描述】:
我正在寻找以下代码中#define 的便携式单行替换。替换应该在Foo 对象的命名空间中隐藏单词APPLE。
class Foo {
public:
#define APPLE 123
Foo(int a) : a_(a) { }
};
// elsewhere in another file
Foo f(APPLE);
我试图让它对 C++ 更友好,并且它使用 Intel 2017 编译器工作:
class Foo {
public:
static constexpr int APPLE = 123;
Foo(int a) : a_(a) { }
};
// elsewhere
Foo a(Foo::APPLE);
但它对 g++ ((GCC) 6.3.1 20170216) 不起作用,因为它给出了错误
undefined reference to Foo::APPLE
因为它可能试图引用APPLE。
我知道我可以通过在 *.cpp 文件中创建定义来“解决”问题
constexpr int Foo::APPLE;
但这违反了我将 #define 替换为 1 行的理想。我的Foo 类只是头文件,现在我需要一个cpp 文件来定义Foo::APPLE。我知道我也可以将 APPLE 声明为一个函数 (static constexpr int APPLE() {return 123;}),但这需要在声明中输入更多内容,并且在每个使用点我都需要使用 () 调用该函数。
使用#define 并完成它似乎更容易。非静态const int 工作正常,但APPLE 不能用作构造函数的参数。也许有一个很好的理由说明这在 C++ 中是不可能的。
编辑:这不是Undefined reference to static constexpr char[] 的副本。该问题与字符串以及出现特定错误消息的原因有关。我试图避免一起使用静态链接(我在我的问题中承认我知道如何进行静态链接)并且我想以一种“更好/更清洁”的方式来做,我从答案中看到了这种方式通过我的标准是使用enum。
【问题讨论】:
-
你会用 C++17 吗?出于这个原因,C++17 有内联变量。
-
C 风格?
enum { APPLE = 123 }; -
@MarkLakata 那么不幸的是,枚举可能是您的最佳选择。不理想,但它有效。
-
static constexpr int APPLE = 123;需要分配存储空间并占用空间。你可以拿APPLE的地址。请改用enum。它实际上是一个符号常量(但你不能获取它的地址)。