参数个数可变的函数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(应用程序二进制接口)。请参阅“是”:必须使用
-不要尝试自己滚动此项。好的,我知道
,但我有一个问题,谢谢。