一个简单的方法是提供一个虚拟的iostream 实现,它只会抛出一个编译时错误。
以下示例假设使用 GCC 工具链 - 我想该过程与其他编译器类似。
首先,创建您的虚拟 iostream 文件:
#error 'Use of iostream is prohibited'
要演示的一些虚拟应用程序代码:
#include <iostream>
int main (int argc, char** argv) {
std::cout << "foo!";
return 0;
}
编译如下(假设虚拟iostream和main.cpp在工作目录中):
g++ -I. main.cpp
编译失败并出现以下错误:
In file included from main.cpp:2:0:
./iostream:1:2: error: #error 'Use of iostream is prohibited'
main.cpp: In function 'int main(int, char**)':
main.cpp:4:2: error: 'cout' is not a member of 'std'
额外的好处:通常在该文件中声明的符号(例如cout 这里)是未定义的,因此也会在编译器输出中被标记。因此,您还可以获得指向您使用禁止 API 的确切位置的指针。
更新:Visual C++ 2012 说明。
正如@RaymondChen 在下面的 cmets 中指出的那样,针对 Visual C++ 量身定制的解决方案可能对 OP 更有用。因此,以下概述了我在 Visual C++ 2012 下实现与上述相同的过程。
首先,使用上面的 C++ 代码创建一个新的控制台项目。还要创建我上面描述的虚拟 iostream 标头,并将它放在一个容易找到的目录中(我把我的放在主项目源目录中)。
现在,在解决方案资源管理器中,右键单击项目节点并从下拉列表中选择“属性”。在出现的对话框中,从左侧的树中选择“VC++ 目录”。将包含虚拟 iostream 文件的目录添加到右侧显示的包含目录列表中,并用分号与其他目录分隔:
在这里,我的项目名为 TestApp1,我只是将其主目录添加到已经存在的 $(IncludePath) 前面。请注意,添加而不是附加很重要 - 列表中目录的顺序决定了搜索顺序,因此如果 $(IncludePath) 出现在您的自定义目录之前,系统标题将优先使用到你的虚拟标题 - 不是你想要的。
单击确定,然后重新构建项目。
对我来说,这样做会导致 VC++ 控制台出现以下错误(为简洁起见,稍作编辑):
error C1189: #error : 'Use of iostream is prohibited'
IntelliSense: #error directive: 'Use of iostream is prohibited'
IntelliSense: namespace "std" has no member "cout"
请注意,IntelliSense 还会发现(现在)非法使用 cout - 它在编辑器中以错误标记突出显示。