用定义C

时间:2018-08-16 09:46:57

标签: c c-preprocessor

我尝试使用define替换函数调用,但是我找不到如何仅替换调用而不是声明的替换方法。

IE:

#define test(); printf("worked\n");

void test()
{
printf("how sad ?\n");
}

int main()
{
test();
}

在函数(项目规则)之后我无法创建定义

问题是:我希望定义中“ test()”之后的分号仅替换调用,但也替换声明。

我试图用google搜索,对此没有任何反应,真的有可能吗?奇怪的是它没有采用文字表达。

3 个答案:

答案 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();
}