#include <stdio.h>和printf()之间的关系是什么?</stdio.h>

时间:2014-04-20 01:17:46

标签: c c-preprocessor

#include <stdio.h>
main()

printf();

预处理器和函数之间有什么联系?

4 个答案:

答案 0 :(得分:2)

当C预处理器读取行#include <stdio.h>时,它从字面上读取系统目录中的文件stdio.h,并将该行替换为内容。然后stdio.h包含printf和其他函数的声明,告诉C编译器这些函数存在于另一个文件或库中

当您在代码中使用printf()时,编译器会知道此函数并知道它不必担心它。 (但是,如果你没有包含stdio.h,那么编译器就不会知道函数的样子,这可能很麻烦,编译器会抱怨这个。)

带有stdio.h的示例printf文件可能如下所示:

/* stdio.h */

// Declaration of printf
int printf(const char *format, ...);

// And also a bunch of other function declarations...

答案 1 :(得分:1)

预处理程序指令#include只包含源文件中包含它们的头文件的来源。

更多信息#include

因此,在这种情况下,#include将在您的程序中包含stdio.h头文件的来源。

头文件stdio.h包含标准输入输出函数的声明,这些函数实际上是在libc中定义的,它由动态链接器作为程序地址空间中的共享库加载。

答案 2 :(得分:0)

<stdio.h>标头将以下宏名称定义为正整数常量表达式:

void     clearerr(FILE *);
char    *ctermid(char *);
char    *cuserid(char *);(LEGACY)
int      fclose(FILE *);
FILE    *fdopen(int, const char *);
int      feof(FILE *);
int      ferror(FILE *);
int      fflush(FILE *);
int      fgetc(FILE *);
int      fgetpos(FILE *, fpos_t *);
char    *fgets(char *, int, FILE *);
int      fileno(FILE *);
void     flockfile(FILE *);
FILE    *fopen(const char *, const char *);
int      fprintf(FILE *, const char *, ...);
int      fputc(int, FILE *);
int      fputs(const char *, FILE *);
size_t   fread(void *, size_t, size_t, FILE *);
FILE    *freopen(const char *, const char *, FILE *);
int      fscanf(FILE *, const char *, ...);
int      fseek(FILE *, long int, int);
int      fseeko(FILE *, off_t, int);
int      fsetpos(FILE *, const fpos_t *);
long int ftell(FILE *);
off_t    ftello(FILE *);
int      ftrylockfile(FILE *);
void     funlockfile(FILE *);
size_t   fwrite(const void *, size_t, size_t, FILE *);
int      getc(FILE *);
int      getchar(void);
int      getc_unlocked(FILE *);
int      getchar_unlocked(void);
int      getopt(int, char * const[], const char); (LEGACY)
char    *gets(char *);
int      getw(FILE *);
int      pclose(FILE *);
void     perror(const char *);
FILE    *popen(const char *, const char *);
int      printf(const char *, ...);
int      putc(int, FILE *);
int      putchar(int);
int      putc_unlocked(int, FILE *);
int      putchar_unlocked(int);
int      puts(const char *);
int      putw(int, FILE *);
int      remove(const char *);
int      rename(const char *, const char *);
void     rewind(FILE *);
int      scanf(const char *, ...);
void     setbuf(FILE *, char *);
int      setvbuf(FILE *, char *, int, size_t);
int      snprintf(char *, size_t, const char *, ...);
int      sprintf(char *, const char *, ...);
int      sscanf(const char *, const char *, int ...);
char    *tempnam(const char *, const char *);
FILE    *tmpfile(void);
char    *tmpnam(char *);
int      ungetc(int, FILE *);
int      vfprintf(FILE *, const char *, va_list);
int      vprintf(const char *, va_list);
int      vsnprintf(char *, size_t, const char *, va_list);
int      vsprintf(char *, const char *, va_list);

正如您所见printf()

中定义了<Stdio.h>

答案 3 :(得分:0)

编译器需要知道函数 printf()的参数及其类型。程序员使用声明告诉它该信息。标准C库使用标准化的头文件集合,其中包含标准C库中函数的声明。 printf()就是其中之一,它的声明在 stdio.h 中。 如果您使用的是Linux,那么每当您使用标准C库函数时,您都可以查看它的手册页,并找到相应的头文件来#include您所使用的函数的声明。重新使用。有一些类别的函数将它们各自的声明聚合成一个或多或少适当命名的头文件。