gpt4 book ai didi

c - 在 C 中获取可变参数的大小?

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

我正在尝试将一些 Java 代码转换为 C。Java 代码如下所示:

public static int minimum( int... minimum ) {

assert( minimum.length > 0 );

if ( minimum.length > 0 )
.... // some code that i am able to translate to C without any hassle
}

现在我了解了如何通过使用 stdarg.h header 和提供的宏在 C 中使用可变参数。但是我一直在做 minimum.length 部分。

我试过 strlen 但终端给我一个不兼容的整数到指针转换警告。在 C 中有什么方法可以复制 Java 所做的相同事情吗?

最佳答案

正如@MichaelBurr 所指出的,不是直接的,您需要传递元素的数量或使用哨兵。

一种间接的方法是使用复合文字:

#include <stdio.h>
#include <stdarg.h>
#include <limits.h>

#define minimum(...) fnminimum(sizeof((int []) {__VA_ARGS__}) / sizeof(int), __VA_ARGS__)

static int fnminimum(int n, ...)
{
int num, min = INT_MAX;
va_list ap;

va_start(ap, n);
while (n--) {
num = va_arg(ap, int);
if (num < min) {
min = num;
}
}
va_end(ap);
return min;
}

int main(void)
{
int a = 1;

printf("%d\n", minimum(2, 30, 7, a++, 4));
return 0;
}

另一种(丑陋的)方法使用 NARGS macros (限于 N 个参数):

#include <stdio.h>
#include <stdarg.h>
#include <limits.h>

#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,_9,N,...) N
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)

#define minimum(...) fnminimum(NARGS(__VA_ARGS__), __VA_ARGS__)

static int fnminimum(int n, ...)
{
int num, min = INT_MAX;
va_list ap;

va_start(ap, n);
while (n--) {
num = va_arg(ap, int);
if (num < min) {
min = num;
}
}
va_end(ap);
return min;
}

int main(void)
{
printf("%d\n", minimum(2, 30, 7, 1, 4));
return 0;
}

输出:

1

关于c - 在 C 中获取可变参数的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42173665/

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