gpt4 book ai didi

c++ - 如何确保没有代码使用 API?

转载 作者:IT老高 更新时间:2023-10-28 22:17:08 25 4
gpt4 key购买 nike

我想禁止在我拥有的代码库中使用 iostream(出于各种原因)。有没有办法在使用该 API 时检查符号文件或强制编译器发出错误?

最佳答案

一个简单的方法是提供一个虚拟的 iostream 实现,它只会抛出一个编译时错误。

以下示例假设使用 GCC 工具链 - 我想该过程与其他编译器类似。

首先,创建您的虚拟 iostream 文件:

#error 'Use of iostream is prohibited'

要演示的一些虚拟应用程序代码:

#include <iostream>

int main (int argc, char** argv) {
std::cout << "foo!";
return 0;
}

编译如下(假设虚拟iostreammain.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 在下面的评论中指出的那样,针对 Visual C++ 量身定制的解决方案可能对 OP 更有用。因此,以下概述了我在 Visual C++ 2012 下实现与上述相同的过程。

首先,使用上面的 C++ 代码创建一个新的控制台项目。还要创建我上面描述的虚拟 iostream header ,并将其放在一个容易找到的目录中(我将我的放在主项目源目录中)。

现在,在解决方案资源管理器中,右键单击项目节点并从下拉列表中选择“属性”。在出现的对话框中,从左侧的树中选择“VC++ 目录”。将包含虚拟 iostream 文件的目录添加到右侧显示的包含目录列表中,并用分号与其他目录分隔:

Adding new path to include directories list

在这里,我的项目名为 TestApp1,我只是将其主目录添加到已经存在的 $(IncludePath) 中。请注意,添加而不是附加很重要 - 列表中目录的顺序决定了搜索顺序,所以如果 $(IncludePath) 出现在您的自定义目录之前之前,系统 header 将优先于您的虚拟 header 使用 - 不是您想要的。

单击确定,然后重新构建项目。

对我来说,这样做会导致 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 - 它在编辑器中以错误标记突出显示。

关于c++ - 如何确保没有代码使用 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com