在编译时剥离特定函数

时间:2016-09-05 11:24:45

标签: c compilation

我正在编写一个使用自定义日志记录功能调试程序的C程序。每当我将程序编译为发布版本时,我希望从代码中删除所有日志记录功能,以便在有人试图反汇编时它不会显示。

采用以下示例:

#include <stdio.h>

void custom_logging_function(char* message)
{
    // Do something here
}

int main()
{
    custom_logging_function("Hello world"); // This call should be removed.
    return 0;
}

我怎样才能使custom_logging_function和它的参数不编译到我的程序中而不必在我的代码中到处编写包含保护?谢谢

2 个答案:

答案 0 :(得分:6)

您可以使用预处理器标志,例如:

#include <stdio.h>

#ifdef DEBUG
void custom_logging_function(char* message)
{
    // Do something here
}
#else
#define custom_logging_function(x) ((void) 0)
#endif

int main()
{
    custom_logging_function("Hello world"); // This call should be removed.
    return 0;
}

使用此代码,您必须告诉&#34; debug&#34;定义DEBUG的目标,如果你想专门为&#34;发布&#34;定义一些内容。目标您可以将#ifdef DEBUG替换为#ifndef NDEBUG,并将NDEBUG标记添加到&#34;发布&#34;定义

编辑:

#define custom_logging_function(x) 0更改为#define custom_logging_function(x) ((void) 0),灵感来自@JoachimPileborg他的回答。

答案 1 :(得分:3)

假设您只希望在应用程序的调试版本中进行日志记录调用,而不是发送给客户的版本构建,您仍然可以使用预处理器和条件编译。通过使用宏而不是在每次调用时都进行检查,可以使它变得简单。

在heder文件中有类似的内容:

#ifdef _DEBUG
void custom_logging_function(char* message);
#else
# define custom_logging_function(message) ((void) 0)
#endif

你可以为release-macro使用一个空的宏体,但这可能会导致一些编译器给出#34;空语句&#34;警告。相反,我使用一个表达式转换为void(告诉编译器不会使用表达式的结果)。任何智能编译器都不会在优化后包含表达式。