【问题标题】:using macro defined in header files使用头文件中定义的宏
【发布时间】:2010-04-07 12:56:23
【问题描述】:

我在头文件中有这样的宏定义:

// header.h
ARRAY_SZ(a) = ((int) sizeof(a)/sizeof(a[0]));

这是在一些头文件中定义的,其中包含更多的头文件。

现在,我需要在某些源文件中使用此宏,而该源文件没有其他理由包含 header.hheader.h 中包含的任何其他头文件,所以我应该在源文件中重新定义宏还是简单地包含头文件header.h.

后一种方法会影响代码大小/编译时间(我认为是)还是运行时(我认为不是)?

您对此的建议!

【问题讨论】:

  • 我认为这可能是一个意外(或什么),但万一不是 - 你不想要 '=' 或 ';' 字符,你希望它是#define 的一部分,例如:#define ARRAY_SZ(a) (/*the expression */)
  • 另外,请查看以下 SO 答案,以获得更复杂的宏版本,该版本具有更高的安全性(不太可能接受给出虚假结果的指针):stackoverflow.com/questions/1598773/…

标签: c++ c header-files


【解决方案1】:

包含头文件或将其分解为更小的单元,并将其包含在原始头文件和代码中。

至于代码大小,除非你的头文件做了一些非常不明智的事情,比如声明变量或定义函数,否则它们应该不会对内存占用产生太大影响,如果有的话。它们会在一定程度上影响您的编译时间并污染您的命名空间。

【讨论】:

  • +1 从标题中提取有用的功能以避免可能不需要的包含/混乱。
【解决方案2】:

在源文件中包含头文件可能会稍微影响编译时间,除非您使用的是预编译头文件。不过,它不应该影响代码大小。重新定义宏不应该对编译时间或大小产生任何影响。不过,这更多的是维护和一致性问题。

【讨论】:

    【解决方案3】:

    我应该在源文件中重新定义宏还是简单地包含头文件header.h

    两者都不是。相反,您应该清理代码并打破header.h,以便人们可以使用ARRAY_SZ(),而不会得到不相关的东西。

    【讨论】:

    • 重要的是要注意,如果您在header.h 中包含新创建的标头,那么出于所有意图和目的,header.h 的实际用户将是透明的,因此绝对是一个简单的更改!
    • @Matthieu:是的,我忘了提。感谢添加!
    【解决方案4】:

    你问:

    后一种方法会影响 代码大小/编译时间(我认为是的)

    在特定宏的情况下,对大小的回答是“否”,因为 sizeof 表达式可以在编译时计算,因此对时间是“是”。两者都不太可能很重要。

    【讨论】:

      【解决方案5】:

      除非您在非常有限的硬件上运行它,或者这被称为数十亿次,否则您不会注意到两者在编译时或运行时有任何区别。

      选择任何看起来更可读/可维护的东西。

      就个人而言,我建议有更好的方法可以在不涉及宏的情况下实现你正在做的事情(即inline functions 和/或function templates)。您必须小心使用您的解决方案,因为您需要留意 a few gotchas

      【讨论】:

        【解决方案6】:

        包含该头文件和包含在其中的所有其他头文件将增加编译时间。如果有其他定义会改变您的代码编译方式,它可能会影响运行时 - 如果您的代码因为这些定义而编译不同,它当然会以不同的方式运行。后者虽然平时不小心。

        【讨论】:

          猜你喜欢
          • 2020-03-05
          • 1970-01-01
          • 2021-07-10
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多