【问题标题】:C program without #include<stdio.h> in Visual StudioVisual Studio 中没有 #include<stdio.h> 的 C 程序
【发布时间】:2012-11-29 18:19:01
【问题描述】:

当我在 Visual Studio 2010 中创建一个简单的 C 程序时, http://debugmode.net/2012/02/06/how-to-write-and-run-a-c-program-in-visual-studio-2010/

我删除了“#include ”,

我的程序仍然运行成功,我不明白怎么可能?

感谢任何帮助。 问候,

【问题讨论】:

  • 请不要按照他们使用void main的习惯。
  • 当我骑得足够快并把手放在车把上时,它会直线行驶。但是,这并不是一个好主意:-)

标签: c visual-studio-2010


【解决方案1】:

除非您使用在其中声明的函数,否则 stdio.h 标头不是严格要求的,例如:

http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html

进一步查看代码我相信当您没有原型时的默认行为是假设 int 返回类型并从在这种特殊情况下有效的参数类型派生参数类型。但这通常是一种不好的做法,应该避免。

如果在没有任何警告的情况下通过编译器/链接器,您可能需要检查您的环境设置。很容易忘记包含标题,如果您没有注意到它可能会导致很多意外且难以追踪的副作用。

【讨论】:

  • 据我所知,它使用printf
  • 不,当声明和/或原型丢失时,默认行为是假定int 返回类型并从参数类型派生参数类型。对于字符串文字,编译器必须推导出参数的类型为char *,而不是int。但是,printf 存在不同的问题。 printf 是一个可变参数函数。如果在没有原型的情况下调用可变参数函数,则行为未定义。
【解决方案2】:

包含标准头文件的主要目的是将标准函数的声明包含到源文件中。

但是,原始标准 C 语言 (C89/90) 不要求在调用函数之前声明函数(可变参数函数除外,它必须使用原型预先声明以避免未定义的行为)。因此,只要我们谈论的是非可变函数调用,完全可以在不预先声明标准函数的情况下编写正确的程序,即不包括标准头文件。

例如,使用两个char * 参数调用strcmp 函数在C89/90 中是完全合法的,无需预先声明strcmp。同时,printf 必须与原型一起预先声明,如果您希望您的程序仍然是具有已定义行为的有效 C 程序。

【讨论】:

    【解决方案3】:

    这个头文件提供了一些常用函数和宏的原型。

    如果您不调用任何这些函数或宏,则不需要它。如果您确实调用它们,只要您链接到正确的库,它仍然可以工作。但如果编译器没有这些定义,您可能会收到一些编译器错误或警告。

    【讨论】:

      【解决方案4】:
      #include < stdio.h >
      

      它是一个称为标准输入输出文件的头文件。输入、输出函数都写在这个文件中。 printf,scanf 等函数 参考这个http://computer.howstuffworks.com/c2.htm

      【讨论】:

      • FWIW,虽然您的回答对 stdio.h 是什么有最直接的回答,但这不是 OP 的意思。他的问题是为什么 stdio.h 的 include 指令可以省略,这意味着他至少对 stdio.h 的作用有一个工作想法。
      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2013-10-05
      • 2018-04-12
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多