作者:R-hehe | 来源:互联网 | 2022-12-07 15:40
我尝试使用define来替换函数调用,但我找不到如何只替换调用而不是声明.
IE:
#define test(); printf("worked\n");
void test()
{
printf("how sad ?\n");
}
int main()
{
test();
}
我无法在函数(项目规则)之后创建我的定义
问题是:我期望在define中的"test()"之后的分号只替换调用,但它也替换了声明.
我试图谷歌,没有任何东西,这真的可能吗?奇怪的是它没有采用文字表达.
1> Attie..:
有几点需要注意:
#define
并不需要括号()
-只有当你需要处理的参数使用它们
语法不包含分号: #define test printf
调用像printf()
这样的函数(有点模糊)可能会有风险,特别是如果调用者不期望他们的字符串被用作格式字符串.比较喜欢#define test(msg) printf("%s", msg)
在a之后#define test ...
,预处理器将愚蠢地替换所有实例test
- 因此函数声明将实际读取void printf("worked\n"); { ... }
结果应该是:
#include
#define test(msg) printf("%s\n", msg)
void main(void) {
test("hello");
}
要么:
#include
void test(const char *msg) {
printf("%s\n", msg);
}
void main(void) {
test("hello");
}
如果您尝试使用a #define
重定向函数调用,则必须使用其他符号...例如:
#include
/* Comment / uncomment this to change behaviour */
#define REDIRECT_TEST
#ifdef REDIRECT_TEST
# define my_test(msg) printf("REDIRECTED:%s\n", msg)
#else
# define my_test test
#endif
void test(const char *msg) {
printf("%s\n", msg);
}
void main(void) {
my_test("hello");
}