我尝试使用define替换函数调用,但是我找不到如何仅替换调用而不是声明的替换方法。
IE:
#define test(); printf("worked\n");
void test()
{
printf("how sad ?\n");
}
int main()
{
test();
}
在函数(项目规则)之后我无法创建定义
问题是:我希望定义中“ test()”之后的分号仅替换调用,但也替换声明。
我试图用google搜索,对此没有任何反应,真的有可能吗?奇怪的是它没有采用文字表达。
答案 0 :(得分:5)
一些注意事项:
#define
不需要 大括号()
-仅在需要处理参数时使用它们#define test printf
printf()
(有点被遮掩)可能会有风险,尤其是在调用者不希望将其字符串用作格式字符串的情况下。更喜欢#define test(msg) printf("%s", msg)
#define test ...
之后,预处理器将笨拙地替换test
的所有实例-因此,函数声明实际上将读取{{ 1}} 结果应为:
void printf("worked\n"); { ... }
或:
#include <stdio.h>
#define test(msg) printf("%s\n", msg)
void main(void) {
test("hello");
}
如果您尝试使用#include <stdio.h>
void test(const char *msg) {
printf("%s\n", msg);
}
void main(void) {
test("hello");
}
重定向函数调用,则必须使用其他符号...例如:
#define
答案 1 :(得分:0)
printf有一个“可变参数”。有时,如果您不使用该q / a中的任何解决方案,就会遇到问题:"How to wrap printf() into a function or macro?"
例如这样的提示:
#define MY_PRINTF(...) printf(__VA_ARGS__)
或者这个:
#define MY_PRINTF(f_, ...) printf((f_), ##__VA_ARGS__)
答案 2 :(得分:-1)
您应该在单独的头文件中具有定义。并且定义不应包含分号。 因此您的代码应如下所示:
replace_test.h:
#define test() dummy_test()
test.h:
void test();
test.c:
void test()
{ your test code}
dummy.c:
void dummy_test()
{
your dummy code here (printf("worked!"); etc.
}
program.c:
//decide which behavior you want, either include replace_test.h or test.h header
#include "replace_test.h"
//#include "test.h"
int main()
{
test();
}