【问题标题】:What could cause "C2065: undeclared identifier" when a variable is defined and it seems to be recognized as such?当定义变量并且似乎被识别为这样时,什么可能导致“C2065:未声明的标识符”?
【发布时间】:2018-01-07 13:49:39
【问题描述】:

在我的 Qt5 C++ 桌面项目的 PRO 文件中,我有以下声明:

DEFINES += PROJECT_VERSION=\\\"1.0.0.0\\\"

在一个类的头文件中,比如Foo,我声明并定义了一个获取版本的方法,如下所示:

QString version() { return PROJECT_VERSION; }

当我尝试编译代码时,出现以下错误:

error: C2065: 'PROJECT_VERSION': undeclared identifier

如屏幕截图所示,PROJECT_VERSION 的颜色编码正确,工具提示也正确,在我看来,它已被识别。那为什么会出现这个错误呢?

我不知道是什么原因导致了这种情况,也不知道这种情况是如何发生的。任何帮助将不胜感激。

【问题讨论】:

  • 好吧,它没有被声明。它不会出现在任何 TU 中。你从外面注入它。
  • @StoryTeller,什么是 TU?此外,我在几个地方使用了 PROJECT_VERSION 并且可以识别。
  • 翻译单元。编译器解析的内容以查看预处理标记和标识符。编译器由于一些外力而知道这个宏是什么的事实,并不意味着静态分析工具有这些信息。
  • 嗯,你有一个明确的配置问题。希望熟悉您的工具链的人会来。我自己对这个特定的经验有限。
  • @StoryTeller,顺便说一句,“工具链”在我看来是一个正确方向的提示,因此我重新标记了这个问题,使其更具体。

标签: c++ windows qt qt5 qmake


【解决方案1】:

我只想提供相关信息,我对问题的描述过于简单了。

事实证明,来自 SUBDIRS 层次结构的另一个 Project B 包含带有 version() 方法的标头。 PROJECT_VERSION 的声明发生在 Project APRO 文件中,其中一部分是标头,但不在 PRO 文件中Project B 的,其中包含它。 Qt Creator 从Project A 中看到PROJECT_VERSION,并且代码完成、颜色编码和工具提示都有效(我认为这就是@StoryTeller 在“静态分析”下的意思)。然而,编译器没有,所以它会抱怨。

造成混淆的原因是,错误并没有发生在包含标头的 Project B 中,而是发生在标头 AND 的 Project APROJECT_VERSION 的声明是。所以起初这似乎是一个矛盾。

解决方案:将DEFINES += PROJECT_VERSION=\\\"1.0.0.0\\\" 添加到Project BPRO 文件中,现在它的编译效果非常好。

再次感谢@StoryTeller 提供的有用提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2011-04-16
    • 2011-04-16
    • 2010-12-24
    • 2023-03-04
    相关资源
    最近更新 更多