1

我有一个几乎在整个源代码中使用的 .h 文件(在我的情况下,它只是一个包含 .cc 和 .h 文件的目录)。基本上,我保留了两个版本的 .h 文件:一个带有一些用于代码分析的调试信息,另一个是常规版本。调试版本只有一个额外的宏和外部函数声明。我经常在两个版本之间切换。但是,这会导致 20 分钟的重新编译。

你会建议如何避免这个重新编译的问题?也许设置一些标志,创建不同的树?常见的解决方案是什么以及如何嵌入它们?

新的 .h 文件包含:

extern  void (foo)(/*some params*/);

/***extra stuff****/
#define foo(...) ( /*call_some_function*/) , foo())
/*some_functions*_for_debugging/

如您所见,这将导致重新编译。我在 Linux AS 3 上使用 gcc 构建

谢谢

4

5 回答 5

3

为了避免外部函数的问题,您可以将原型保留在两个版本中,如果不使用,它不会有害。但是没有宏的机会,你可以忘记它,它需要重新编译以替换代码。

我会大量使用预编译的头文件来加快重新编译(因为它无法避免)。GCC 和预编译头文件。对于其他编译器,请使用您最喜欢的搜索引擎。任何现代编译器都应该支持此功能,对于大型项目,您不可避免地必须使用它,否则您将真的没有生产力。

除此之外,如果您有足够的磁盘空间,我会检查两个工作副本。他们每个人都用不同的设置编译。您每次都必须提交和更新才能将更改转移到另一个工作副本,但肯定需要不到 20 分钟 ;-)

于 2009-10-06T11:36:03.060 回答
2

您需要最小化依赖于该头文件的代码量(特别是文件数)。除此之外,您无能为力 - 当您需要更改标头时,您将面临重新编译包含它的所有内容。

所以你需要重新组织你的代码,使得只有一个选择的文件包含标题。例如,您可以将需要其内容的函数移动到单独的源文件(或多个文件)中,并且仅将标头包含在这些文件中,而将其包含在其他文件中。

于 2009-10-06T11:19:31.563 回答
2

如果调试宏实际上用于大多数包含头文件的文件中,那么无论如何都需要重新编译它们!在这种情况下,您有两个选择:

  1. 保留两套目标文件,一套没有调试代码,一套有。使用不同的 makefiles/build 配置以允许它们保存在不同的位置。

  2. 使用全局变量,如下所示:

在你的 common.h 中:

extern int debug;

在你的 debug.c 中:

int debug = 1;

其他任何地方(可以为此使用宏):

if (debug) {
    /*(do_debug_stuff*/
}

这个概念的一个细微变化是调用 debug.c 中的一个实际函数,如果禁用调试,它可能什么都不做。

于 2009-10-06T11:28:14.167 回答
2

我不太明白你的问题。据我了解,您正在尝试创建一个测试框架。我可以提出一些建议。您可以将更改的内容移动到 .c 文件,如下所示。

在新的.h

extern  void (foo)(/*some params*/);

/***extra stuff****/
#define foo(...) ( /*call_some_function_dummy*/) , foo())
/*some_functions*_for_debugging/

在新的.c

call_some_function_dummy()
{

#ifdef _DEBUG

    call_some_function()

#endif

}

现在如果切换到调试模式,只需要重新编译New.c,编译速度会快很多。希望这会帮助你。

解决方案2:

在新的.h

extern void (foo)(/*some params*/);

/***extra stuff****/ 
#define foo(...) ( /*call_some_function[0]*/) , foo()) 
/*some_functions*_for_debugging/

在 New.c 中

#ifdef _DEBUG 

call_some_function[] = 
{
    call_some_function0,
    call_some_function1
};

#else 

call_some_function[]
{
    dummy_nop,
    dummy_nop
};

#endif
于 2009-10-06T12:18:31.693 回答
1

为什么不将宏移动到它自己的标题中,并且只在需要的地方包含它。

只是另一个想法。

我看不出如何避免重新编译依赖的源文件。但是,您可以加快构建中的其他处理。

例如,您可以使用一种预编译头文件的形式,并且只将您的头文件包含在代码文件中,而不包括其他头文件。另一种方法可能是并行构建,或者可能使用快速硬件,例如固态驱动器。

请记住,硬件很便宜,引用 wotshisname 的程序员很昂贵。

于 2009-10-06T11:21:08.253 回答