【问题标题】:File Local Define文件本地定义
【发布时间】:2011-03-20 18:31:59
【问题描述】:

这个问题更多地属于最佳实践和用于分发的干净/安全代码的类别。

我正在开发一个 C++ 数学库,用于我的作品集,并在我大学的最后两个学期使用。我希望这个库非常易于使用,并尽量减少与现有代码冲突的可能性。

为了便于阅读,我将 TEMP_T 定义为类的模板,位于每个头文件(math/matrix/vec/quaternion)的顶部。如下所示:

#ifdef TEMP_T
#define UNDEF_TEMP_T TEMP_T // Used to reset any other definitions later.
#endif // TEMP_T
#define TEMP_T  template<class T> // Used to make the code more readable.

稍后,在文件末尾,如果需要,我会重置预先存在的定义:

#undef TEMP_T // Get rid of our definition.
#ifdef UNDEF_TEMP_T
#define TEMP_T UNDEF_TEMP_T // Reset the previous definition, if it existed.
#undef UNDEF_TEMP_T
#endif // UNDEF_TEMP_T

我的问题:这是否会成功地创建一个对文件可见的定义,并且单独的文件?如果是这样,这就是你将如何去完成这样的事情吗?如果没有,您能不能给我一些关于您做事方式背后的理性的见解?

【问题讨论】:

  • 就像你在评论中所说的,你不需要这个 TEMP_T 宏。它不会增加可读性。事实上它减少了它,因为你需要知道它的定义才能理解它。

标签: c++ windows templates visual-studio-2008 c-preprocessor


【解决方案1】:

IMO 可读性差很多,属于预处理器滥用类别,我强烈建议使用实际定义,这将使您的代码更易被其他人阅读,这是可读性的重点。

【讨论】:

  • 我同意,它确实在我脑海中闪过几次。当应用于我的编码风格时,我仍在尝试在可读性、功能性和可用性之间找到平衡。感谢您的反馈。
【解决方案2】:

在我看来,这样会降低可读性。这将是减少要输入/读取的字符数量的方法,但它也会增加所需的人工解释的数量,这是一件坏事。

最重要的是,如果有人在他们自己的代码中定义了TEMP_T,他们会通过包含您的标头来丢失他们的定义。

// my code.cpp
#define TEMP_T( var, vartype ) myclass<vartype> var( ##var );

#include <yourmathlib.h>
TEMP_T( anint, int )  // breaks.  hard to find the real error.

因此,您可能会定义一个特定于库的MYMATHLIB_TEMP_T,这会进一步降低可读性:)

【讨论】:

  • 如果我的逻辑对我有用,那么我相信我已经避免了过度编写其他用户预先存在的 TEMP_T 定义的警告。我现在开始更多地考虑它,我可能正在尝试找到解决非问题的方法。我根本无法使用 TEMP_T。我最初用它来帮助清理东西,现在我必须清理我的清理工作,它开始违背自己的目的。感谢您的反馈。
【解决方案3】:

你可以只#include你在其他头文件中声明模板的头文件。

如果你想确保你不会从 2 个不同的文件中两次包含同一个文件,你可以有

#ifndef MYMATHLIB_TEMP_T
#define MYMATHLIB_TEMP_T

// ... template ...

#endif

围绕模板头文件。

【讨论】:

  • 是的,我可以。然而,这不是我想要做的。不过感谢您的回复。
【解决方案4】:

您可以在头文件中定义 TEMP_T 并在所有代码中使用该头,也许您可​​以尝试测试您的头是否包含在某个宏中。 但是这种做事方式增加了阅读代码的复杂性。

【讨论】:

    【解决方案5】:

    为什么不简单地将模板类放在命名空间中呢?如果你把它放在一个命名空间中,你就可以避免所有讨厌的宏东西。命名空间被明确设计为允许代码单元相互隔离而不会发生命名冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多