如何在C中的#define宏中用字符串常量替换函数名

时间:2014-07-15 12:21:22

标签: c string macros c-preprocessor preprocessor-directive

我希望使用预处理器指令用字符串替换函数调用。 像这样:

#ifdef DEBUG
    #define Func1(arg) "Function not supported"
#endif

所以基本上当有人调用这个函数时,我想要一个编译错误,这样这个函数在DEBUG模式下是不可见的,代替它,在编译日志中打印下面的字符串。 此方法抛出错误。 有没有其他方法可以在调用func1()时打印我想要的特定字符串?

3 个答案:

答案 0 :(得分:2)

实现此类行为的最明显方法是使用#error指令。但是,由于无法构造“条件#error指令”,我想下一步是在C99中引入_Pragma运算符。以下是在编译期间生成消息的解决方案:

#include <stdio.h>

#define DEBUG 1

#ifdef DEBUG
    #define Func1(arg) _Pragma("message \"Function not supported.\"")
#endif

void (Func1)(int arg)
{
}

int main(void)
{
    Func1(1);
    Func1(2);
    Func1(3);

    return 0;
}

编译(使用gcc):

...
check.c:15: note: #pragma message: Function not supported.
check.c:16: note: #pragma message: Function not supported.
check.c:17: note: #pragma message: Function not supported.

我知道这不是直接解决方案(此类消息甚至不被视为警告,因此-Werror不会更改任何内容),但您可以使用例如grep工具或扫描编译器输出的任何其他方法。

由于GCC 4.8还有#pragma GCC error "message",这是直接(但非便携)的解决方案。有关详细信息,请查看this answer。例如:

#ifdef DEBUG
    #define Func1(arg) _Pragma("GCC error \"Function not supported.\"")
#endif

答案 1 :(得分:1)

一种方法是简单地保留函数undefined。这将导致链接时出错。

如果你使用gcc,你可以使用它的一个扩展,一个函数属性:

#ifndef DEBUG
#define __nodebugonly
#else
#define __nodebugonly __attribute__((error("Function not supported")))
#endif

void Func1(int arg) __nodebugonly;

答案 2 :(得分:0)

您可以使用

#error "Function not supported"

中止编译。 但显然当有人可以访问可以删除的源时 - 那么你究竟要做什么呢?

如果您不相信那些拥有您的来源的人,请不要将其提供给他们。 将其链接到.obj,定义&#39;界面&#39;用.h然后只给出。