通常,在使用变量函数时,我们总是对预期输入的数量给出某种排序,但永远不知道传递了多少.

那么,当我向printf()函数传递的参数超过所需数量时,编译器如何能够检测到呢?

以下是示例代码

#include <stdio.h>

int main()
{
    
    printf("Hello World", 2); 
 
    return 0;
}

输出:

main.c: In function ‘main’:
main.c:6:12: warning: too many arguments for format [-Wformat-extra-args]
    6 |     printf("Hello World", 2,3,4);
      |            ^~~~~~~~~~~~~
Hello World

我使用的是以下在线编译器:https://www.onlinegdb.com/online_c_compiler

推荐答案

使用的编译器足够智能(*),可以将printf()识别为特殊函数,在本例中是标准库的函数.此函数用于接收格式字符串.如果编译器可以读取该格式字符串,它将解释格式代码,就像printf()一样.因此,它预计以下参数的数量和类型.

例如,您可以将此功能用于您自己的类似printf的函数(无耻地从GCC's manual复制):

extern int
my_printf (void *my_object, const char *my_format, ...)
      __attribute__ ((format (printf, 2, 3)));

(*)"足够智能"意味着在"stdio.h"中使用该属性声明printf(),编译器知道如何处理该属性.

C++相关问答推荐

为什么静态说明符为内联函数生成外部定义?

什么C代码将确定打开的套接字正在使用的网络适配器?

如何将不同长度的位转换成字节数组?

在C中使用动态内存分配找到最小的负数

堆栈帧和值指针

GCC引发不明确的诊断消息

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

我无法让LLDB正确运行我的可执行文件

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

用C++构建和使用DLL的困惑

在C程序中使用Beaglebone Black UART的问题

为什么Linux无法映射这个PT_LOAD ELF段?

Linux分段故障(核心转储)

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

无法理解 fgets 输出

C Makefile - 如何避免重复提及文件名

C simd _m128 晶圆厂

当循环变量在溢出时未定义时,可以进行哪些优化?