【问题标题】:Header correct, but identifier not found标题正确,但未找到标识符
【发布时间】:2010-03-26 20:51:23
【问题描述】:

我有两个项目 (x64)。

一个。用 C (wxWidgets) 编写 --- 编辑:它是用 C++ 编写的!

B。用 C++ 编写

A 可以正常编译,但是当我尝试编译时,B(它使用 A 的函数)会出现一些错误。

我认为所有错误的原因都是一样的,所以我只提到第一个。 它说:

strlen: identifier not found

在给出错误消息的文件 (wxcrtbase.h) 中,包含以下标头:

#include <stdio.h>
#include <string.h>`

B 中的文件包含 A 中的以下标头:

#include "wx/wx.h"
#include "wx/dcbuffer.h" 
#include "wx/spinctrl.h"

所以,目前,我不知道从哪里开始搜索错误原因。可能是我有 C 和 C++ 文件吗?也许是我为 x64 编译的?

感谢您的帮助!

编辑:更多信息
wxcrtbase.h 中产生第一条错误消息的行是:

#ifdef __cplusplus  
inline size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s) : 0; }  
inline size_t wxStrlen(const wchar_t *s) { return s ? wcslen(s) : 0; }  

wxcrtbase.h 的包含顺序是

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <wctype.h>
#include <time.h>
#include <io.h>

/showIncludes 列出了以下内容(我在前两条错误消息之后停止了该列表):

1>Compiling...
1>widget.cpp
1>Note: including file: m:\visual studio 2008\projects\general\rama\src\widget.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include \string
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\ostream
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\ios
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xlocnum
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\climits
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\yvals.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\sal.h
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtassem.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\vadefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\use_ansi.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\limits.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdio
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdio.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\swprintf.inl
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdlib
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdlib.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\streambuf
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xiosbase
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xlocale
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstring
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx\string.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/defs.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/platform.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\setupp.h
1>Note: including file: m:\visual studio 2008\projects\general\wxwidgets-2.9.0\include\wx/version.h
1>Note: including file: m:\visual studio 2008\projects\general\wxwidgets-2.9.0\include\wx/cpp.h
1>Note: including file: m:\visual studio 2008\projects\general\wxwidgets-2.9.0\include\wx/cpp.h
1>Note: including file: M:/Visual Studio 2008/Projects/general/wxWidgets-2.9.0/lib/vc_lib/mswud/wx/setup.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/msw/libraries.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/chkconf.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/msw/chkconf.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/version.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/dlimpexp.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stddef.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/debug.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\assert.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file:  M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/chartype.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/platform.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\tchar.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\wchar.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\wtime.inl
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/cpp.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/windowid.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/msw/winundef.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/features.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx\string.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\stdarg.h
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/wxcrtbase.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\io.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cctype
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\ctype.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cwctype
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\wctype.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\ctime
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\time.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\time.inl
1>Note: including file:  M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/chartype.h
1>M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/wxcrtbase.h(705) : error C3861: 'strlen': identifier not found
1>M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/wxcrtbase.h(718) : error C3861: '_strdup': identifier not found

【问题讨论】:

  • 能贴出B的代码吗?另请注意,wxWidgets 是用 C++ 编写的,所以如果您的项目 A 使用 wxWidgets,我敢打赌它也是用 C++ 编写的。
  • 对不起,我不能发布它。而且,它只有几千行代码。 B 包含如下内容:#include "wx/wx.h" #include "wx/app.h" #include "wx/frame.h"(A. IS wxWidgets 和 B. 是使用 wxWidgets 的代码)编辑:I看到 wxWidgets 也是 c++,但是有些文件有 .c 结尾...
  • edit2:更奇怪的是:错误消息来自 wxcrtbase.h。这个头不是B.直接调用的,显然是从另一个wxWidgets文件中调用的。
  • 你有没有注意到 string.h 没有被包含在内?根据您的日志包含的唯一 string.h 是 ...\general\wxWidgets-2.9.0\include\wx/cpp.h
  • 会不会是你复制粘贴了一些头文件,忘记修复保护并且文件实际上没有被包含在内? (我的意思是它确实包含在内,但内容被忽略)尝试在#include &lt;string.h&gt; 之后放置一个#warning something 并查看编译时是否出现警告。如果不是,则包含 wxcrtbase.h 有问题

标签: c++ c visual-studio-2008


【解决方案1】:

尝试和/或回答的一些事情:

  • 您能否至少发布几行,包括编译器生成“未找到标识符”错误的那一行?
  • 当您说您有一个 #include &lt;string.h&gt; 行时,究竟包含哪些文件以及它是否位于各种 wx 之前?
  • 您能否在使用/showIncludes 选项构建时发布包含的标头的输出(它位于“C/C++/Advanced/Show Includes”下的 VS 2008 IDE 的 C++ 项目属性页中)?

编辑,添加新信息:

根据您所做的编辑,其中包括来自/showIncludes 的更完整列表,您似乎可能错误地设置了 INCLUDE 路径。以下是日志中的几行:

1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstring
1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx\string.h

当 MSVC 的 cstring 标头尝试包含 string.h 时,它会从 wx 库中获取 string.h 标头,而不是编译器分发的一部分(将在 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string.h 中)。

我不确定wx 库为什么会命名他们自己的标题之一string.h(而不是,比如说,wxString.h),但我认为它是打算由使用类似:

#include "wx/string.h"

无论如何,我认为您可以通过确保 MSVC 包含目录位于 INCLUDE 搜索路径中的任何其他目录之前来解决您的问题。

【讨论】:

  • 1. #ifdef __cplusplus 内联 size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s):0; } 内联 size_t wxStrlen(const wchar_t *s) { return s ? wcslen(s) : 0; 2. string.h 仅在 wxWidgets 文件中。原来的顺序是:#include #include #include #include #include #include 3.我按照你的建议做了。输出很长。我必须为此写一个新帖子。
  • 迈克尔,非常感谢您的大力帮助。有了 MSVC 目录,它现在就可以工作了!
【解决方案2】:

如果 wxWidgets 是 C++,并且它包含 and 并且您的编译器阻止包含 and 当包含 cstring/cstdio 时,则 strlen 将位于 std 命名空间而不是全局命名空间中。试试 std::strlen 看看是否能修复错误。

【讨论】:

  • 不幸的是,这不起作用。消息:std 不是类或命名空间。 wxcrtbase.h 文件的标题为: "#include "wx/chartype.h" #include #include #include #include #include #include "
  • #include of system headers () 应该几乎总是出现在 #include of local headers ("")之前
  • 将系统标头放在前面并没有改变错误消息。
【解决方案3】:

试试 #include&lt;cstdio&gt;#include&lt;cstring&gt;,它们是 C++ 的标头

【讨论】:

  • 用 cstdio 和 cstring 替换 stdio.h 和 string.h 并不能解决任何问题。
【解决方案4】:

试试:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <cwctype>
#include <ctime>
#include <cio>

using namespace std;

#include "wxcrtbase.h"
#include "wx/chartype.h"

int main(void) {
    return strlen("hey there good buddy!");
}

这是我最讨厌 c++ 的地方。

【讨论】:

  • 您确定“”存在吗?我收到错误,但在 Internet (google) 上找不到?
  • 当我用 io.h 替换 cio 编译您的代码时,我再次收到相同的错误消息
  • 但是,至少很高兴看到即使没有我自己的项目B也存在问题。所以,这一定是wxWidgets内部的问题?!​​
  • 我试图展示的只是包含和命名空间使用的不同顺序。 应该表示“命名空间标准 { #include }”。
【解决方案5】:

评论栏太小了。 我回答迈克尔·伯尔:

一个。

#ifdef __cplusplus
inline size_t wxStrlen(const char *s) { return s ? wxCRT_StrlenA(s) : 0; }
inline size_t wxStrlen(const wchar_t *s) { return s ? wcslen(s) : 0; }`

B. string.h 仅在 wxWidgets 文件中。

原来的顺序是:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <wctype.h>
#include <time.h>
#include <io.h>

C. 这是第一条错误消息之前的几行和之后的一行:

1>Note: including file: M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/chartype.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\ctype.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\wctype.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\time.h
1>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\time.inl
1>Note: including file:  C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\io.h
1>Note: including file: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\crtdefs.h
1>M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/wxcrtbase.h(696) : error C3861: 'strlen': identifier not found
1>M:\Visual Studio 2008\Projects\general\wxWidgets-2.9.0\include\wx/wxcrtbase.h(709) : error C3861: '_strdup': identifier not found

【讨论】:

  • 我认为您应该编辑您的问题以包含此信息,而不是将其包含在答案中,以使可能想要帮助回答问题的人更容易。此外,我认为您可能需要包含一个 .c/.cpp 文件的 /showIncludes 输出中的所有行 - 至少到错误 C3861 行。您显示的内容并不表示包含 string.h,但这可能是因为它是在您决定开始复制/粘贴之前。
  • 我已根据您添加到问题中的信息修改了我的答案。
【解决方案6】:

我遇到了同样的问题。我的修复与包含订单有关。在stdafx.h 之前包含string.h 会导致错误。反之亦然。似乎编译器完全忽略了string.h

【讨论】:

    【解决方案7】:

    我确实认为你必须包括 cstdio 和 cstring(如上面所建议的),但在这种情况下,所有内容都将驻留在命名空间 std 中,如 std::strlen 等......

    【讨论】:

    • 我很想给你投反对票!用cstring替换string.h如何解决问题??!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2016-07-25
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多