繁体   English   中英

编译器如何在此代码中知道printf()的原型?

[英]How does the compiler know the prototype of printf( ) in this code?

在以下代码中,

#include<conio.h>
clrscr();
gotoxy(10, 20);
ch= getch(a);

我们可以看到调用库函数时没有定义它们的原型,这三个库函数: clrscr() gotoxy(int int)getch()在conio.h头文件中定义了它们的原型,它们出现在头文件本身中像这样,

void clrscr();
void gotoxy(int int);
int getch();

但是在下面的代码中,编译器如何知道printf()函数的原型? 由于代码被执行而没有任何错误,尽管在第一个printf()中最后一个int格式说明符将打印垃圾值,而在第二个int格式说明符中将不打印j的值,因为未指定它。

#include<stdio.h>
int i=10, int j=20;
printf("%d%d%d",i,j);
printf("%d",i,j);

头文件stdio.h如何描述printf()函数的格式说明符为float或char变量时的情况?

编译器知道原型,因为它是在您包括的<stdio.h>声明的。

<stdio.h>没有描述格式说明符。 它只是说

int printf(const char *, ...);

...表示printf接受可变数量的参数(未知类型)。


您对printf第一次调用具有未定义的行为(格式字符串的参数不足)。 您的第二个调用很好(多余的参数将被忽略)。 不需要C编译器来检测这样的格式字符串问题。

在使用前,应在相应的header file prototypeddeclared任何诸如printf类的predefined function ,以便在执行程序时编译器可以验证程序员是否使用了正确的格式。

printf()函数prototype在名为stdio.h header file声明。

当编译器执行代码的第一行#include<stdio.h> ,就知道了printf原型。

man 3 printf

 int printf(const char *format, ...);// last 3 dots specifies the variable no of arguements printf can take 

在下面的代码中, printf导致未定义的行为,因为printf需要3参数,但您仅提供了2参数。

printf("%d%d%d",i,j);

stdio标头始终包含相同的printf()声明,即:

int printf(const char *fmt, ...);

无论您在格式字符串中放入哪个拼版机,声明始终是相同的。

通常,printf的定义\\实现会遍历fmt字符串中的每个字符,并将每个标识的占位符替换为适当的参数。 编译后的代码将尝试使用参数而不是占位符,其顺序与源代码中指定的顺序相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM