使用头文件中定义的宏

时间:2010-04-07 12:56:23

标签: c++ c header-files

我在头文件中有一个宏定义,如下所示:

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

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

现在,我需要在某个源文件中使用此宏,该文件没有其他理由包含header.hheader.h中包含的任何其他头文件,因此我应该在源文件中重新定义宏或者只是包含头文件header.h

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

您的建议!

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

  

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

都不是。相反,您应该清理代码并中断header.h,以便可以使用ARRAY_SZ()而不会获得不相关的内容。

答案 3 :(得分:2)

你问:

  

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

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

答案 4 :(得分:2)

除非你在非常有限的硬件上运行它,或者这被称为数十亿次,否则在编译时或运行时你都不会注意到它们之间的任何差异。

选择看似更易读/可维护的内容。

就个人而言,我建议有更好的方法来实现你在那里做的事情而不涉及宏(即inline functions和/或function templates)。您必须小心使用您的解决方案,因为您需要密切关注a few gotchas

答案 5 :(得分:1)

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