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 的字符串。你的每一个定义都会污染命名空间,并且每个includes 你的标题的人都可以看到。这也提供了编译时检查哪些标志被认为是有效的。

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 只写一次的值?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能让innerHtml 只写一次错误?

请求参数完整性校验,解决流只能写一次的问题

Ext.define() 中有关 initComponent() 的最佳实践

Partials vs for 循环——最佳实践

业务重构

干货IT项目Scrum常用最佳实践!轻松入门!实战经验分享!