Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在我向.h文件添加调试时,分离编译以避免重新编译_C++_C_Debugging_Gcc_Header Files - Fatal编程技术网

C++ 在我向.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*/); /*

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

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

新的.h文件包含:

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

/***extra stuff****/
#define foo(...) ( /*call_some_function*/) , foo())
/*some_functions*_for_debugging/
正如您所见,这将导致重新编译。我使用gcc在Linux上构建as3


谢谢

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


因此,您需要以这样一种方式重新组织代码,即只有选定的文件包含头。例如,您可以将需要其内容的函数移动到一个单独的源文件(或多个文件)中,并且只将头文件包含到这些文件中,而将其移动到其他文件中。

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


因此,您需要以这样一种方式重新组织代码,即只有选定的文件包含头。例如,您可以将需要其内容的函数移动到一个单独的源文件(或多个文件)中,并且只将头包含在这些文件中,而不包含在其他文件中。

为什么不将宏移动到其自己的头中,并且只在需要时包含它呢

只是另一个想法

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

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


请记住,引用wotshisname。

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

只是另一个想法

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

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


请记住,引用wotshisname。

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

  • 保留两组对象文件,一组没有调试代码,另一组有调试代码。使用不同的makefile/build配置,允许将它们保存在不同的位置

  • 使用全局变量,大致如下所示:

  • 在你的共同点中。h:

    extern int debug;
    
    在debug.c中:

    int debug = 1;
    
    其他地方(可以使用宏进行此操作):


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

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

  • 保留两组对象文件,一组没有调试代码,另一组有调试代码。使用不同的makefile/build配置,允许将它们保存在不同的位置

  • 使用全局变量,大致如下所示:

  • 在你的共同点中。h:

    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