【问题标题】:What is the best practice for define in C++? [closed]在 C++ 中定义的最佳实践是什么? [关闭]
【发布时间】:2015-11-14 15:47:33
【问题描述】:

我想知道是否有关于在 c++ 语言中使用 define 的官方建议,确切地说是在你的头文件或源文件中定义最好吗?
我想知道是否有任何官方标准可以遵循,或者仅仅是主观的......我不需要整套标准,但指南的来源或链接就足够了。


稍后编辑:
constconstexpr 已成为现状的事实是什么解释,我指的是 define 用作避免重复输入的手段,我很清楚程序员应该充分利用c++ oop 编译器。另一方面,如果它如此恐惧,为什么不将它完全删除呢?我的意思是,据我了解,define 仅用于条件编译,尤其是在使相同的代码在不同的编译器上工作时。
次要的,小问题,潜在的错误也是java没有真正的C风格define的主要原因?

【问题讨论】:

  • 最小范围。如果它只用在一个 C 文件中,把它放在那里。如果多次使用,放在头文件中。
  • 这是主观的,但有些约定如果不遵守会很愚蠢。始终对宏使用 ALL_CAPS 名称(出于我在 stop the constant SHOUTING 中给出的原因,切勿对非宏使用 ALL_CAPS 名称)
  • 这不是官方的,但只要避免使用 c++ 就可以了。有很少见的用例。
  • @πάνταῥεῖ:这有点过分......当然,如果内联函数或const 变量或模板或其他任何不错的选择,它们应该是首选,但我认为在非常本地的情况下没有什么不好(=在使用前定义,之后立即未定义)宏来节省一些输入并避免由于复制粘贴代码而导致的错误。
  • @MatteoItalia 这只是一个示例。宏(甚至在本地使用)比常规变量定义或内联函数更容易出错,因为它们只处理文本,这为意外结果留下了很多空间。我提到有 rare 有效的用例。正如您所提到的,标记化就是其中之一。

标签: c++ standards c-preprocessor


【解决方案1】:

#define C++ 使用指南的简短列表,第 2、4、6 和 7 点实际上解决了这个问题:

  1. 避开它们
  2. 将它们用于头文件中常见的"include guard" pattern
  3. 否则,请不要使用它们,除非您能解释为什么您使用 #define 而不是 constconstexpr 或内联或模板函数等。
  4. 使用它们允许从编译器命令行提供编译时选项,但仅当将该选项作为运行时选项不可行或不可取时。
  5. 在您使用的任何库需要使用它们时使用它们(例如:禁用assert() function
  6. 一般来说,将所有内容都放在尽可能窄的范围内。对于#define 宏的某些用途,这意味着#define 就在.cpp 文件中的函数之前,然后#undef 就在函数之后。
  7. #define 的确切用例决定了它应该在.h 还是.cpp 文件中。但请注意,大多数用例实际上都违反了上述 3.,您实际上不应该使用#define

【讨论】:

  • 谢谢你的好意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多