【问题标题】:Get built arguments in C在 C 中获取内置参数
【发布时间】:2015-02-21 09:13:52
【问题描述】:

有没有办法检查编译时使用的参数?

喜欢:

gcc -std=c99 -ggdb3 source.c -o sate-enak

source.c:

...
#ifdef (-ggdb3 variable is defined)
    do_some_function();
#else
    do_another_function();
#endif
...

使用这种方法,我可以知道程序是为生产编译的还是产品编译的。

【问题讨论】:

    标签: c gcc compilation c-preprocessor


    【解决方案1】:

    使用gcc,据我所知,您可以使用宏实现相同的目标:

    在你的 Makefile 中:

    CFLAGS_DEBUG = -ggdb3 -DDEBUG 
    CFLAGS = -std=c99 $(CFLAGS_DEBUG)
    

    然后在你的程序中:

    #ifdef DEBUG     
        do_some_function();
    #else
        do_another_function();
    #endif
    

    【讨论】:

    • 谢谢。在我看来,这是最简单的方法(而且答案更快:D)。
    • 而且需要 6 分钟才能接受。 :`(
    【解决方案2】:

    没有一种简单的方法可以识别编译器使用的选项。除此之外,大多数程序都是由许多源文件构建的,并且这些源文件可能已经使用不同的选项集进行编译。

    通常,如果你想知道,你用命令行控制它#define

    gcc -DMODE=MODE_OPTIM -O3 …
    gcc -DMODE=MODE_DEBUG -ggdb3 …
    

    你有一个定义MODE_OPTIMMODE_DEBUG含义的标题:

    enum CompilationMode { MODE_OPTIM, MODE_DEBUG };
    
    #ifndef MODE
    #define MODE MODE_DEBUG
    #endif
    
    extern enum CompilationMode compiled_for;
    

    你定义的地方:

    enum CompilationMode compiled_for = MODE;
    

    然后你可以在任何你需要知道程序是用哪种模式构建的地方测试compiled_for

    实际上,这是运行时决策。对于编译时决策,您将 enum 替换为:

    #define MODE_OPTIM 0
    #define MODE_DEBUG 1
    

    你可以测试一下:

    #if MODE == MODE_DEBUG
        do_some_function();
    #else
        do_another_function();
    #endif
    

    【讨论】:

    • 或者只使用NDEBUG 宏。 (当然,除非你打算不在你的发布代码中 #define 它。)
    • 绝对不是NDEBUG;它控制是否启用断言,这与它是否是生产代码无关——至少在我的书中是这样。我可能会根据MODE 的值触发NDEBUG 是否处于活动状态;我不会反其道而行之(从而重载NDEBUG 的含义)。
    • 因为对于给定的构建,运行时决策通常不会改变,所以编译时间会更可取...除非您希望通过修改从调试代码路径切换到非调试代码路径的选项来自调试器的变量。
    • @Dmitri:这取决于上下文和总体目标以及两个函数之间的不同之处。我通常没有看到用于生产和调试构建的不同算法。根据我的经验,这仅仅意味着生产代码不会被正确测试,因为调试版本不会对其进行测试。但是您可以使用任何一种技术,或同时使用两种技术(通过适当的调整)。
    • ..除了在运行时对编译时选项的测试将始终为真或始终为假,因此将其设为运行时测试毫无意义(除非您可能人为地更改结果) .
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多