【问题标题】:Compilation issue - code C2129编译问题 - 代码 C2129
【发布时间】:2012-05-07 04:42:17
【问题描述】:

错误 C2129:静态函数 'void func(int,char *)' 已声明但未定义

我读到了:

必须在文件范围内定义静态函数。如果函数在另一个文件中定义,则必须声明为 extern。

文件范围是否意味着它必须在 C++ 或 .h 中定义,还是仅在其声明的 .h 文件中定义?

【问题讨论】:

    标签: c++ file winapi


    【解决方案1】:

    C++编译器看不到.h文件,文件的内容会被预处理器自己放入cpp文件中。这里的文件范围是该函数应该在 cpp 文件中。

    【讨论】:

    • 好的。干杯。我遇到的问题是在名为 util.h 的文件中有一个声明为静态的函数。如果我右键单击并转到 Go To Definition,它会将我带到 .cpp 中的定义。但是当我编译时,我得到了上面的错误。这两个文件都在同一个位置,我在 Additional Include Directories 属性中添加了它。您知道为什么会发生这种情况吗?
    • 当你得到错误时,你应该注意你实际编译的文件。当你编译 Util.cpp 并且函数在 Util.cpp 中定义时,你不会得到那个错误。
    • 您需要从 util.h 中删除静态函数 - 静态函数只能在 .cpp 文件中,并且只能在该 .cpp 文件中使用 - 如果您需要在两个 .cpp 文件中使用那么它需要是外部的
    • @Mark - 在头文件中包含整个静态函数也是有效的。这很像模板函数,并且在每个使用该标头的目标文件中创建目标代码。在某些情况下它可以派上用场。
    【解决方案2】:

    如果函数在另一个文件中定义,则必须声明 外部。

    在此语句中,“另一个文件”翻译为“另一个目标文件”,最终将在编译后链接在一起。就像 Naveen 回答的那样,编译器并不真正关心函数在哪个源文件中声明。

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多