我在头文件中有一个宏定义,如下所示:
// header.h
ARRAY_SZ(a) = ((int) sizeof(a)/sizeof(a[0]));
这在一些头文件中定义,其中包含更多头文件。
现在,我需要在某个源文件中使用此宏,该文件没有其他理由包含header.h
或header.h
中包含的任何其他头文件,因此我应该在源文件中重新定义宏或者只是包含头文件header.h
。
后一种方法会影响代码大小/编译时间(我认为是),还是运行时(我认为没有)?
您的建议!
答案 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)
包含该标头和其中包含的所有其他标头将增加编译时间。如果有其他定义会改变代码的编译方式,它可能会影响运行时 - 如果您的代码编译方式不同,因为这些定义当然会以不同的方式运行。虽然后者通常不小心。