gpt4 book ai didi

可变参数的 C 宏

转载 作者:太空狗 更新时间:2023-10-29 15:50:22 25 4
gpt4 key购买 nike

我正在尝试编写一个返回几个整数中最小值的宏。当我编译以下代码时,它会抛出一个错误“expected expression”。我不知道那里出了什么问题。谁能指出这段代码的问题?

#define SMALLEST (nums, (ret_val), ...)          \
do { \
int i, val; \
va_list vl; \
va_start(vl,nums); \
(*ret_val) = va_arg(vl, int); \
for (i = 1; i < nums; i++) \
{ \
val=va_arg(vl, int); \
if ((*ret_val) > val) \
(*ret_val) = val; \
} \
va_end(vl); \
} while(0)

int main ()
{
int nums = 3;
int ret_val = 0;
SMALLEST(nums, &ret_val, 1, 2, 3);
return 0;
}

我只是好奇如何用 Macro 来做。

最佳答案

I am just curious about how to do it with Macro.

你不能。 va_list可变参数函数 访问其参数的一种方式。你写的是一个可变参数宏。它们不一样(特别是可变参数宏仍然只是一种语法上的便利,不能让您处理单个参数)。做你想做的事情的唯一方法是在可变参数宏中调用你自己设计的可变参数函数(然后你还不如删除宏)。

但是,如果您真的坚持使用可变参数宏,结果证明您很幸运,在宏参数和数组初始值设定项中使用了相同的分隔符 ,,因此您可以尝试类似:

#define F(X, ...) \
do { \
int t[] = { __VA_ARGS__ }; \
for (int i = 0; i < sizeof t / sizeof t[0]; i++) \
… \
} while (0)

关于可变参数的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050280/

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