【问题标题】:VS2013 Assuming extern declaration for unidentified symbol for .c filesVS2013 假设 .c 文件的未识别符号的外部声明
【发布时间】:2014-08-04 20:38:35
【问题描述】:

显然,在 .c 文件中,Visual Studio 会自动生成未识别符号的声明。我尝试使用不包含 stdio.h 的 printf(),以及调用一些随机 asd() 函数并且它编译时没有错误,只有警告出现,编译器假定 extern 返回 int。可以肯定的是,我编译了程序集输出,它确实有那些 extern 声明。当然链接不成功。

我的问题是,如何关闭自动生成未识别符号的声明?我有一些项目要做,可能会把我搞砸。

【问题讨论】:

  • 编译器假定 extern 返回 int 意味着编译器没有您尝试调用的函数的定义。如果您包含您正在使用的调用所需的标头,并且每个函数的定义对您的环境是可见的(即运行时环境,例如:msvcr100.dll,其中一些版本包含在 Visual Studios 中)您的构建将不会出现错误,也不会出现那些特定的警告。
  • @ryyker OP 已经在问题中说明了你刚才所说的一切。
  • @Jashaszun - 再读一遍。 尝试使用 printf() 而不包括 stdio.h。这意味着编译器没有它需要的信息。 C 假定 int,因此在警告中定义了 extern,但构建将失败。
  • @ryyker 嗯...是的。他编译时没有stdio.h,这就是为什么他希望得到错误,而不仅仅是警告。
  • 发布sscce ...相关代码,以及编译字符串。

标签: c compiler-construction visual-studio-2013


【解决方案1】:

这是编译器警告 C4013。

http://msdn.microsoft.com/en-us/library/d3ct4kz9.aspx

您可以使用 /we 标志设置编译命令,将特定警告视为错误。

http://msdn.microsoft.com/en-us/library/thxezb7y.aspx

/we n 将 n 中指定的编译器警告视为错误。 例如,/we4326 将警告编号 C4326 标记为错误。

如果您想变得非常保守,您可以将所有警告视为错误。许多团队/项目认为这是一种最佳做法。

/WX 将所有编译器警告视为错误。对于一个新项目,它可能 最好在所有编译中使用 /WX;解决所有警告将 确保尽可能少的难以发现的代码缺陷。链接器也 有一个 /WX 选项。有关更多信息,请参见 /WX(将链接器警告视为错误) 信息。

【讨论】:

  • 这将是很好的解决方法,谢谢。但是有没有办法完全关闭这个功能呢?
  • 在哪种情况下使用/we4013不会完全禁用此功能?
  • @instancedName - 更重要的是,您为什么要关闭编译器的这种有用且信息丰富的功能。 (注意,这只不过是编译器告诉你出了点问题。它不是 Visual Studios 的auto_generation 功能)
【解决方案2】:

显然,在 .c 文件中,Visual Studio 会自动为未识别符号生成声明
这不是一个正确的结论
这不是 Visual Studio 的问题。这只是来自您的编译器的警告,描述了它在没有任何实际定义的情况下对函数所做的假设。

来自HERE

当你调用一个没有原型的函数时,一些 C 编译器会假设被调用的函数:

Function's return type is assumed to be int
All parameters are assumed to be declared (i.e. no ... vararg stuff)
All parameters are assumed to be whatever you pass after default promotions, and so on.   

如果在没有原型的情况下调用的函数符合这些假设,那么您的程序将正确运行;否则,这是未定义的行为。

来自HERE

如果未指定函数原型,则行为特定于编译器实现的 C 标准(C90 或 C99)。直到 C90 标准,C 编译器将省略的函数原型的返回类型假定为 int。而编译器端的这种假设可能会导致未指定的程序行为。

要解决您看到的问题,没有必要(也不会解决所述问题)在 Visual Studios 中进行任何更改,而是包含头文件适合您正在使用的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多