c/c++语言开发共享使用带有任意数量参数的函数的参数,单位为C.

我刚才读到: “C void arguments”关于C中这些函数定义之间的差异:

int f(void) 

 int f() 

理解第二种forms意味着函数返回带有任意数量参数的整数,我想知道我们如何才能实际访问和使用这些未知参数

我很想得到示例代码和解释。

另外,我知道C语言中的Varargs的机制(使用va_argva_endva_start函数),并且很高兴听到这种机制与上面提到f()forms之间的差异

非常感谢!

    int f(void)表示返回int的函数,不带参数。

    您可以看到此示例以查看使用int f()的结果

     #include  void f(); int main() { f(); /* prints some garbage */ f(16); /* prints 16 */ return 0; } void f(a1) int a1; { printf("%dn", a1); } 

    还有: –

     #include  #include  int f(); int f(int x) { return x; } int main (int argc, char *argv[]) { printf ("%dn", f(atoi(argv[1]))); return 0; } pax> gcc -Wall --std=c99 -o qq qq.c pax> ./qq 42 42 

    第二个版本不接受可变数量的参数,它接受固定(但未指定)的参数序列。 实际上,它声明了函数,但没有对函数进行原型化。 因此,不会检查函数调用的有效类型。 编译器通常会查看对函数的第一次调用,并针对第一次调用中找到的类型检查其他调用。

    这就是为什么,如果你省略#include ,第一次调用printf是可以接受的,但是对不同类型的printf任何调用都会产生错误。 例如。

     int main() { printf("hello"); //<--- accepted, compiler may assume `int printf(char *);` printf("%s", "world"); //<--- error, type mismatch } 

    要让函数接受变量号,它必须至少有一个固定参数,然后是令牌...

     int f (int first, ...); 

    您需要包含stdarg.h头文件。 该函数可以使用宏访问参数。

     void f (int c,...){ va_list ap; va_start(ap, c); for(;c--;) printf("%d", va_arg(ap,int)); va_end (ap); } 

    将固定参数作为剩余参数的计数是很方便的。 您还需要以某种方式确定每个参数的类型。 在这个例子中,假设它们都是int

      int f(void); 

    f声明为不带参数的函数并返回int结果,而

      int f(); 

    f声明为一个函数,它接受一个固定但未指定的数字和参数类型(当然,返回一个int结果)。

    鉴于这样的声明,必须有一个实际定义参数的定义。 如果它不带参数,则可以定义为:

     int f() { return 42; }; 

    如果它需要2个int参数,则可能定义为:

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

    这两个定义都与int f();兼容int f(); ,但只有第一个与int f(void)兼容。

    一个函数声明,指定参数的类型,或者,作为特殊情况,使用void关键字指定没有参数,是原型执行此操作的函数声明,例如int f(); 是一种旧式的宣言。

    除非您使用不支持原型的几十年前的ANSI之前的编译器,或者您维护的是非常旧的代码并且没有时间或其他资源来更新它, 否则没有理由不使用原型。 如果你调用一个没有可见原型的函数,你仍然需要传递正确的数字和类型的参数; 区别在于编译器无法告诉您调用是否不正确。

    (您可以定义一个带有变量数和参数类型的函数; printf就是一个例子。这是使用, ...表示法完成的。函数本身使用定义的特性来处理参数但这与你提问中的声明无关。)

    这是一个使用过时的旧式函数声明和定义的小程序:

     #include  #include  int add(); int main(argc, argv) int argc; char **argv; { if (argc == 3) { /* NOTE: atoi() does no error checking */ printf("sum = %dn", add(atoi(argv[1]), atoi(argv[2]))); } else { fprintf(stderr, "Usage: %sxyn", argv[0]); exit(EXIT_FAILURE); } } int add(x, y) int x, y; { return x + y; } 

    请注意,如果我写了add(1, 2, 3, 4)add("foo", "bar") ,编译器就不会捕获错误; 该计划本来就是行为不端。

    这是使用现代函数声明和定义的等效程序:

     #include  #include  int add(int x, int y); int main(int argc, char **argv) { if (argc == 3) { /* NOTE: atoi() does no error checking */ printf("sum = %dn", add(atoi(argv[1]), atoi(argv[2]))); } else { fprintf(stderr, "Usage: %sxyn", argv[0]); exit(EXIT_FAILURE); } } int add(int x, int y) { return x + y; } 

    可见原型意味着编译器能够诊断不正确的调用。

    至于f()forms: 点击 。

    一个例子,类似printf的函数,可以将十进制数字或字符串打印到文件描述符中:

    需要了解更多c/c++开发分享使用带有任意数量参数的函数的参数,单位为C.,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!

     #include  /* Formatted printing into a file descriptor */ int printfd(int fd, char *fmt, ...) { int bytes = 0; int i_val = 0; va_list va; va_start(va, fmt); while (*fmt) { char *perc = strchr(fmt, '%'); int len = perc == NULL ? strlen(fmt) : perc - fmt; if (len) { bytes += write(fd, fmt, len); fmt += len; } else { fmt = perc + 1; if (*fmt == 0) continue; else if (*fmt == '%') bytes += write(fd, fmt, 1); else if (*fmt == 'd') bytes += writedec(fd, va_arg(va, int)); else if (*fmt == 's') bytes += writestr(fd, va_arg(va, char*)); fmt++; } } va_end(va); return bytes; } 

      以上就是c/c++开发分享使用带有任意数量参数的函数的参数,单位为C.相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979621.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐