gpt4 book ai didi

c - (C) 宏中包含 2 个参数的宏无法编译,但在功能上运行良好。我想知道为什么。谢谢

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:57 24 4
gpt4 key购买 nike

昨天我尝试使用宏优化我的代码,但它在某些句子中无法编译。为了简单起见,我在下面编写了代码来描述我想要解决的问题:

#define MACRO(x, y) ((x) + (y))
#define X 2,3

int fun(x, y)
{
return x+y;
}

int main(void)
{
int res;
res = fun(X); //ok
res = MACRO(X); //**error:macro "MACRO" requires 2 arguments, but only 1 given**
printf("%d\n", res);
return 0;
}

我曾经认为宏只是简单地替换单词,所以这样做没有问题,但现在我认为我错了。 :(

更准确地说:我正在尝试做类似的事情:

//global.h
#define MACRO(brief, num) fun(__LINE__, brief, num)

//test.c
#include <global.h>
#define X "brief",3

void fun(int line_num, char* brief, int num)
{
printf("%d, %s,%d\n", line_num, brief, num); //do something
}

int main(void)
{
fun(__LINE__, X); //ok
MACRO("brief",3); //ok
MACRO(X); //error: macro "MACRO" requires 2 arguments, but only 1 given
return 0;
}

所以我需要使用这种类型的宏来减少参数。

昨天到处找了找也没找到,希望能在这里得到解答。多谢。 :)

(我的英语不是很好,我希望我能清楚地描述我的问题。)

最佳答案

您可以使用预处理器的可变参数功能,如以下示例 (available on IdeOne) 所示:

#include <stdio.h>

#define MACRO(...) MACRO_IMPLEMENTATION(__VA_ARGS__)
#define MACRO_IMPLEMENTATION(x,y) ((x)+(y))

#define X 2,3

int main (void) {
printf ("MACRO (X) = %d\n", MACRO (X));
printf ("MACRO (2,3) = %d\n", MACRO (2,3));
return 0;
}

输出是

MACRO (X)   = 5
MACRO (2,3) = 5

MACRO 的定义采用绑定(bind)到 __VA_ARGS__ 的变量编号或参数(参见 the standard 中的 6.10.3 节)。 MACRO 的定义调用 MACRO_IMPLEMENTATION 现在看到两个参数,因为 MACRO 是用两个参数调用的,或者是因为它是用扩展为的参数调用的两个参数的列表。

关于c - (C) 宏中包含 2 个参数的宏无法编译,但在功能上运行良好。我想知道为什么。谢谢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42126885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com