【问题标题】:Can't use cout/endl when extern "C"extern "C" 时不能使用 cout/endl
【发布时间】:2012-05-14 22:45:20
【问题描述】:

我希望有人可以帮助我解决这个小问题,因为我一无所获。首先,代码如下:

#include<string>
#include<iostream>
#include<Windows.h>

using namespace std;

extern "C"
{
#include<hidsdi.h>
#include<SetupAPI.h>
}

int main()
{
    int iQuit;

    cout << "Testing Program" << endl;

    return 0;
}

它不会让我使用标准的东西(即 cout、cin、endl 等)。只有当我取出所有外部“C”代码时,它才允许我使用它……这是为什么呢?有没有办法解决这个问题?

编辑:对不起,忘记告诉你确切的错误:它说标识符“cout”是未定义的

谢谢

【问题讨论】:

  • 无论如何我都不会在全球范围内使用 std 。您可以移动 using namespace std;在主里面。
  • extern "C" 在这里的作用是什么?
  • 因为 cout 不是 C 关键字,而是 C++ 单例实例。您不能从纯 C 代码访问 C++ 对象(尽管反过来也可以)。
  • @DavidHeffernan 我正在学习编写驱动程序,以便可以使用键盘和鼠标等设备进行操作,因此我正在使用 WDK。如果我错了,请纠正我,但我认为您需要使用 extern "C" 来使用那些头文件?
  • 驱动程序是用 C 而不是 C++ 编写的。

标签: c++ extern


【解决方案1】:

你的编译环境有问题。该代码没有任何问题。它编译并运行良好。

在对您所说的问题的评论中:

我正在学习编写驱动程序,以便可以使用键盘和鼠标等设备进行操作,因此我正在使用 WDK。如果我错了,请纠正我,但我认为您需要使用 extern "C" 来使用那些头文件?

事实上,您应该简单地用 C 而不是 C++ 编写代码来进行驱动程序开发。

【讨论】:

  • hmm... 从不知道您可以将代码编译为 C:S。我如何检查它? :S
  • 你是怎么编译的?什么编译器,什么命令行选项?文件的名称是什么?特别是扩展名是什么。
  • 我使用的是 Visual Studios 2010。文件名为 Mainframe.cpp
  • @Danny 如果你将文件重命名为Mainframe.c,它将自动编译为C。
【解决方案2】:

我发现了问题,我没有在 VC++ 目录中以正确的顺序添加目录。

顺序应该是:

C:\WinDDK\7600.16385.1\inc\ddk
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
C:\WinDDK\7600.16385.1\inc\api
$(WindowsSdkDir)include
$(FrameworkSDKDir)\include

不知道为什么要按这个顺序,但是现在可以了……很奇怪……

【讨论】:

  • 驱动开发不同。您应该使用 C 编写代码,并且需要小心包含哪些标头。仅包含顶级标题,例如ntddk.h
  • @DavidHeffernan 感谢您的建议 :)。我知道你一直在说用 C 编写驱动程序,但是用 C++ 编写它真的有那么糟糕吗??
  • 是的。当您的 C++ 代码引发异常时,您会怎么做?这在驱动程序中并不漂亮。还有其他担忧。网络搜索将我引向了这个讨论:msdn.microsoft.com/en-us/windows/hardware/gg487420
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2013-03-03
  • 2020-03-19
相关资源
最近更新 更多