C++ 在我向.h文件添加调试时,分离编译以避免重新编译
我有一个.h文件,几乎在整个源代码中都使用它(在我的例子中,它只是一个包含..cc和.h文件的目录)。基本上,我保留了两个版本的.h文件:一个版本包含一些用于代码分析的调试信息,另一个版本是常规版本。调试版本只有一个额外的宏和外部函数声明。我经常在两个版本之间切换。但是,这会导致20分钟的重新编译 您建议如何避免重新编译的问题?也许要设置一些标志,创建不同的树?常见的解决方案是什么?如何嵌入它们 新的.h文件包含:C++ 在我向.h文件添加调试时,分离编译以避免重新编译,c++,c,debugging,gcc,header-files,C++,C,Debugging,Gcc,Header Files,我有一个.h文件,几乎在整个源代码中都使用它(在我的例子中,它只是一个包含..cc和.h文件的目录)。基本上,我保留了两个版本的.h文件:一个版本包含一些用于代码分析的调试信息,另一个版本是常规版本。调试版本只有一个额外的宏和外部函数声明。我经常在两个版本之间切换。但是,这会导致20分钟的重新编译 您建议如何避免重新编译的问题?也许要设置一些标志,创建不同的树?常见的解决方案是什么?如何嵌入它们 新的.h文件包含: extern void (foo)(/*some params*/); /*
extern void (foo)(/*some params*/);
/***extra stuff****/
#define foo(...) ( /*call_some_function*/) , foo())
/*some_functions*_for_debugging/
正如您所见,这将导致重新编译。我使用gcc在Linux上构建as3
谢谢您需要最小化依赖于该头文件的代码量(特别是文件数)。除此之外,你不能做太多——当你需要更改标题时,你将面临所有包含它的内容的重新编译
因此,您需要以这样一种方式重新组织代码,即只有选定的文件包含头。例如,您可以将需要其内容的函数移动到一个单独的源文件(或多个文件)中,并且只将头文件包含到这些文件中,而将其移动到其他文件中。您需要最小化依赖于该头文件的代码量(特别是文件数)。除此之外,你不能做太多——当你需要更改标题时,你将面临所有包含它的内容的重新编译
因此,您需要以这样一种方式重新组织代码,即只有选定的文件包含头。例如,您可以将需要其内容的函数移动到一个单独的源文件(或多个文件)中,并且只将头包含在这些文件中,而不包含在其他文件中。为什么不将宏移动到其自己的头中,并且只在需要时包含它呢 只是另一个想法 我看不出如何避免重新编译依赖源文件。但是,您可以加快构建中的其他处理 例如,您可以使用一种形式的预编译头,并且只在代码文件中包含headerr,而不包含其他头。另一种方法可能是并行构建,或者可能使用快速硬件,如固态驱动器
请记住,引用wotshisname。为什么不将宏移动到它自己的头中,并且只在需要的地方包含它呢 只是另一个想法 我看不出如何避免重新编译依赖源文件。但是,您可以加快构建中的其他处理 例如,您可以使用一种形式的预编译头,并且只在代码文件中包含headerr,而不包含其他头。另一种方法可能是并行构建,或者可能使用快速硬件,如固态驱动器
请记住,引用wotshisname。如果调试宏实际用于包含标头的大多数文件中,则无论如何都需要重新编译它们!在这种情况下,您有两个选项:
extern int debug;
在debug.c中:
int debug = 1;
其他地方(可以使用宏进行此操作):
这个概念的一个微小变化是调用debug.c中的实际函数,如果禁用调试,该函数可能什么也不做。如果调试宏实际用于包含头的大多数文件中,那么它们无论如何都需要重新编译!在这种情况下,您有两个选项:
extern int debug;
在debug.c中:
int debug = 1;
其他地方(可以使用宏进行此操作):
这个概念的一个微小变化是在debug.c中调用一个实际函数,如果禁用调试,它可能什么也不做。为了避免外部函数的问题,您可以将原型保留在两个版本中,如果不使用原型,也不会造成任何伤害。但由于宏不可能,您可以忘记它,它需要重新编译以替换代码 我会大量使用预编译头来加快重新编译(因为这是不可避免的)。对于其他编译器,请使用您喜爱的搜索引擎。任何现代编译器都应该支持这一特性,对于大型项目来说,不可避免地要使用它,否则将非常低效
除此之外,如果您有足够的磁盘空间,我将签出两个工作副本。它们中的每一个都使用不同的设置进行编译。您必须每次提交和更新以将更改传输到另一个工作副本,但所需时间肯定少于20分钟;-) 为了避免外部函数的问题,您可以将原型保留在两个版本中,如果不使用原型,也不会有任何伤害。但由于宏不可能,您可以忘记它,它需要重新编译以替换代码 我会大量使用预编译头来加快重新编译(因为这是不可避免的)。对于其他编译器,请使用您喜爱的搜索引擎。任何现代编译器都应该支持这一特性,对于大型项目来说,不可避免地要使用它,否则将非常低效
除此之外,如果您有足够的磁盘空间,我将签出两个工作副本。它们中的每一个都使用不同的设置进行编译。您必须每次提交和更新以将更改传输到另一个工作副本,但所需时间肯定少于20分钟;-) 我不太明白你的问题。据我所知
call_some_function_dummy()
{
#ifdef _DEBUG
call_some_function()
#endif
}
extern void (foo)(/*some params*/);
/***extra stuff****/
#define foo(...) ( /*call_some_function[0]*/) , foo())
/*some_functions*_for_debugging/
#ifdef _DEBUG
call_some_function[] =
{
call_some_function0,
call_some_function1
};
#else
call_some_function[]
{
dummy_nop,
dummy_nop
};
#endif