参数个数可变的函数c

参数个数可变的函数c,c,function,C,Function,我有一个参数数目可变的函数,所以我想访问它们,而不使用intvariable作为许多其他参数。我试图使用指向第一个参数的指针访问参数。但是我得到的结果不是我期望的结果。你看,我有一个特殊的符号\0作为参数的结尾。有什么线索吗?或者我应该返回使用va_list访问参数吗 #include <stdio.h> int vowels(char symbol, ...); int main() { printf("%d\n", vowels('a', 'e', '

我有一个参数数目可变的函数,所以我想访问它们,而不使用
int
variable作为许多其他参数。我试图使用指向第一个参数的指针访问参数。但是我得到的结果不是我期望的结果。你看,我有一个特殊的符号
\0
作为参数的结尾。有什么线索吗?或者我应该返回使用
va_list
访问参数吗

#include <stdio.h>

int vowels(char symbol, ...); 

int main() {

printf("%d\n", vowels('a', 'e', 'o', 'i', 'u', '\0'));

printf("%d\n", vowels('d', 'b', 'o', 'c', 'u', '\0'));

return 0;
}
int vowels(char symbol, ...) {
    int counter = 0;
    char *ptr = &symbol;
    while (*ptr != '\0') {

        if (*ptr == 'a' || *ptr == 'e' || *ptr == 'o' || *ptr == 'i' || *ptr == 'u') {
           counter++;
        }

        ptr++;
    }
    return counter;
    }
#包括
int元音(字符符号,…);
int main(){
printf(“%d\n”,元音('a','e','o','i','u','0');
printf(“%d\n”,元音('d','b','o','c','u','\0');
返回0;
}
int元音(字符符号,…){
int计数器=0;
char*ptr=&symbol;
而(*ptr!='\0'){
如果(*ptr=='a'| |*ptr=='e'| |*ptr=='o'| |*ptr=='i'|*ptr=='u'){
计数器++;
}
ptr++;
}
返回计数器;
}

您正在寻找的是一个
可变函数
。你必须
#包括
。更多信息可以在这里找到:如果你想自己做,你需要看看C运行库的源代码,看看当你访问参数时它做了什么。或者生成的内联代码做什么,如果编译器内联此代码。用于轻松查看生成的代码。这也是ARM和x86-64目标上记录的ABI问题,因此您可以从中了解参数是如何传递给变量函数的

通常,使用
char*
会忽略堆栈上ABI强制的参数对齐。在C++中,在大多数情况下,您希望“代码> char Calar(Value*)*/Cuth>,但即使这样,这种操作也是未定义的行为,因此您编写的是易碎和不可移植的代码。


当您使用标准的可变参数支持正确地实现它时,您的代码将可以在多种体系结构中移植,甚至是小型8位和16位微控制器。我刚刚检查过,代码可以在Zilog的eZ8(一个具有16位远指针的8位系统)和Zilog ZNEO(一个具有24位指针和32位整数的16位系统)上运行,这是在Zilog自己的C编译器上,而不是在gcc上。我已经检查过它在硬件和IDE中的模拟器上都能工作。

您必须使用函数来访问可变函数。使用指针将失败,因为它们通过堆栈或寄存器的传递方式取决于机器ABI(应用程序二进制接口)。请参阅“是”:必须使用
-不要尝试自己滚动此项。好的,我知道
,但我有一个问题,谢谢。