C++ - 最佳实践#define 只写一次的值?
Posted
技术标签:
【中文标题】C++ - 最佳实践#define 只写一次的值?【英文标题】:C++ - best practice #define values which are written only once? 【发布时间】:2016-02-16 17:07:30 【问题描述】:在我们的代码中,我们需要处理配置,为此我们需要将配置名称作为 std::string 传递给我们自己的框架。 示例代码:
framework.handle_config("enable-radio-link")
framework.handle_config("enable-tv-link")
framework.handle_config("enable-gateway-link")
so on to ...n
这些字符串将只写在一个地方,不会在其他任何地方重复。除了只有 2 或 3 个配置。
我的队友希望将其作为#define 和使用,作为最佳实践。喜欢
#define ENABLE_RADIO_LINK "enable-radio-link"
#define ENABLE_TV_LINK "enable-tv-link"
framework.handle_config(ENABLE_RADIO_LINK)
framework.handle_config(ENABLE_TV_LINK)
我在想,这只会让阅读代码和交叉引用这些#defines 的含义多一点时间。
#define(或 static const 其他)它们并使用它,即使它在一个地方使用,这真的是一种最佳实践吗?
拥有这个有什么好处?
【问题讨论】:
如果这些字符串只出现在一个地方,我不会将它们预定义为常量。 预处理宏是evil! (对于certain definitions of evil) 【参考方案1】:由于它是您自己的框架,因此获得“只有一个地方”的好处的更好主意是更改 enum class
的字符串。你的每一个定义都会污染命名空间,并且每个include
s 你的标题的人都可以看到。这也提供了编译时检查哪些标志被认为是有效的。
enum class MyConfiguration
EnableRadioLink,
EnableTVLink
;
void enableConfig(MyConfiguration config)
// Do something with config
int main()
//...
enableConfig(MyConfiguration::EnableRadioLink);
enableConfig(MyConfiguration::EnableTVLink);
//...
return 0;
;
【讨论】:
好吧,当涉及到我们的框架时,我们必须使用字符串......但是,您的意思是在我们的代码中有枚举,并且当传递给框架时将枚举转换为字符串? 枚举的目的是防止您传递非法或不正确的值。这是一种“将正方形放入方孔”的解决方案,可让您在编译时检查以确保您发送有效值。如果您对字符串感到困惑,我可能会选择@Carlton 的解决方案,因为枚举类的底层类型必须是整数类型,而转换函数将是更多代码。【参考方案2】:我更喜欢
const std::string ENABLE_RADIO_LINK = "enable-radio-link";
而不是宏,因为编译器会知道前者,但不会知道后者。换句话说,当字符串被定义为常量而不是宏时,您将收到更多有用的错误和警告消息。
您还可以将所有这些常量包装到一个命名空间中,这样更安全并且可能更易于阅读。示例:
namespace FrameworkConsts
const std::string ENABLE_RADIO_LINK = "enable-radio-link";
const std::string ENABLE_TV_LINK = "enable-tv-link";
/*etc.*/
然后像这样使用它们:
framework.handle_config(FrameworkConsts::ENABLE_RADIO_LINK);
【讨论】:
请注意,这不再是编译时常量。为此,您使用constexpr char ENABLE_RADIO_LINK[] = "enable-radio-link";
是的,我同意。当涉及到#define 或静态常量时,我也更喜欢使用静态常量。但是定义和使用它们的真正优势是什么..
优点是当你不可避免地需要违背你的字符串“只会写在一个地方”和“不会在其他地方重复”的承诺时,管理它们会容易得多如果它们被定义在一个地方,则使用。另一个技术含量较低的优势是大多数 IDE 会识别您的常量并建议它们自动完成。
并更改名称,使其不再像宏。以上是关于C++ - 最佳实践#define 只写一次的值?的主要内容,如果未能解决你的问题,请参考以下文章