如何在VC++中毒害标识符
How to poison an identifier in VC++?
函数中毒是C++中非常有用的技术。
通常,它指的是使函数不可用,例如,如果你想禁止在程序中使用动态分配,你可以"毒害"malloc函数,使其无法使用"中毒"标识符意味着在"中毒"之后对该标识符的任何引用都是硬编译错误
例如(请参阅此处的实时演示)
#include <iostream>
#include <cstdlib>
#pragma GCC poison malloc
int main()
{
int* p=(int*)malloc(sizeof(int)); // compiler error use of poisoned function malloc
*p=3;
std::cout<<*p<<'n';
free(p);
}
我发现这种技术对于防止C++中保留字的误用非常有用。
例如:
#include "test.h" // contains definition of some class T
#pragma GCC poison private
#define private public // oops compiler error use of poisoned identifier private in macro
int main()
{
// Instantiate T & use it members
}
这也可以在C中用于防止C++关键字的使用,因为C++比C&使用C++特定的关键字作为C.中的标识符是完全有效的
例如(请参阅此处的实时演示)
#include <stdio.h>
#pragma GCC poison new
int main(void)
{
int new=5; // oops compiler error use of poisoned identifer new.
printf("%d",new);
}
但要使用这种中毒,我们需要使用实现定义的pragma指令。幸运的是,GCC实用主义者通过clang&也很好用。但是,如果我有VC++编译器(Microsoft Visual studio),则需要哪个杂注。如何在VC++编译器中做到这一点?
MSVC++有两种方法可以做到这一点。要获得GCC版本,您可以使用#pragma弃用。这会产生警告C4995,您可以使用/WX将其转化为错误。
然而,这会毒害具有指定名称的任何标识符,它的选择性不足,无法防止对碰巧具有相同标识符名称的C++成员发出警告。例如,你不能用它来贬低特定的函数重载。通过第二种方法__declspec(已弃用)解决。
一般来说,为了避免意外匹配,你更喜欢后者。但要注意,它有一个鸡和蛋的问题,你只能弃用编译器知道的函数。强迫你,比如说,#包含一个你根本不想使用的头。
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- #ifdef和未声明的标识符
- f2、f3、f4标识符未找到
- 设置 Visual Studio for MPI: 找不到标识符错误
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 如何让 GCC/Clang 在保留标识符上出错
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 使用说明符 extern 声明的C++中的标识符链接
- C++:枚举:错误:应使用标识符而不是"}"
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- Visual Studio C++ PlaySound 标识符未定义
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 使用未声明的标识符"sqrt"?
- 找不到标识符合并
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 在 c++ 中找不到此函数的标识符
- 对类 (C++) 中的私有变量使用未声明的标识符