gpt4 book ai didi

c - 特定的 C 函数如何工作?

转载 作者:太空狗 更新时间:2023-10-29 16:46:28 25 4
gpt4 key购买 nike

我正在尝试学习 C,但已经很困惑了。

在我使用的 OOP 语言中,存在执行方法重载的能力,其中相同的函数可以具有不同的参数类型并调用最合适的那个。

现在在 C 中我知道情况并非如此,所以我无法弄清楚以下问题,printf() 的工作原理。

例如:

char chVar = 'A';
int intVar = 123;
float flVar = 99.999;

printf("%c - %i - %f \n",chVar, intVar, flVar);
printf("%i - %f - %c \n",intVar, flVar, chVar);
printf("%f - %c - %i \n",flVar, chVar, intVar);

既然 C 不支持函数重载,那么 printf 如何设法接受任意数量、任意类型的参数,然后正确地处理它们?

我试图通过下载 glibc 源包找到 printf() 工作,但似乎可以找到它,尽管我会继续寻找。

谁能解释一下 C 是如何完成上述任务的?

最佳答案

C 支持一种称为“varargs”的函数签名,意思是“变量(数量)参数”。这样的函数必须至少有一个必需的参数。对于 printf,格式字符串是必需的参数。

通常,在基于堆栈的机器上,当您调用任何 C 函数时,参数会从右到左压入堆栈。这样,函数的第一个参数就位于堆栈的“顶部”,就在返回地址之后。

定义了 C 宏,允许您检索变量参数。

重点是:

  • 变量参数没有类型安全。对于 printf(),如果格式字符串错误,代码将从内存中读取无效结果,可能会崩溃。
  • 变量参数通过一个指针读取,该指针通过包含这些参数的内存递增。
  • 参数指针必须用 va_start 初始化,用 va_arg 递增,用 va_end 释放。

我已经发布了大量代码,您可能会对相关问题感兴趣:

Best Way to Store a va_list for Later Use in C/C++

这是 printf() 的框架,它只格式化整数(“%d”):

int printf( const char * fmt, ... )
{
int d; /* Used to store any int arguments. */
va_list args; /* Used as a pointer to the next variable argument. */

va_start( args, fmt ); /* Initialize the pointer to arguments. */

while (*fmt)
{
if ('%' == *fmt)
{
fmt ++;

switch (*fmt)
{
case 'd': /* Format string says 'd'. */
/* ASSUME there is an integer at the args pointer. */

d = va_arg( args, int);
/* Print the integer stored in d... */
break;
}
}
else
/* Not a format character, copy it to output. */
fmt++;
}

va_end( args );
}

关于c - 特定的 C 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883896/

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