我希望使用预处理器指令用字符串替换函数调用。 像这样:
#ifdef DEBUG
#define Func1(arg) "Function not supported"
#endif
所以基本上当有人调用这个函数时,我想要一个编译错误,这样这个函数在DEBUG
模式下是不可见的,代替它,在编译日志中打印下面的字符串。
此方法抛出错误。
有没有其他方法可以在调用func1()
时打印我想要的特定字符串?
答案 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然后只给出。