如何在VC++;? 函数中毒< /强>是C++中非常有用的技术。

如何在VC++;? 函数中毒< /强>是C++中非常有用的技术。,c++,visual-c++,pragma,preprocessor-directive,C++,Visual C++,Pragma,Preprocessor Directive,一般来说,它指的是使一个函数不可用,例如,如果你想禁止在程序中使用动态分配,你可以“毒害”malloc函数,使其不能使用“中毒”标识符意味着在“中毒”之后对标识符的任何引用都是硬编译器错误 例如(见现场演示) 这也可以用于C++中,因为C++中有很多关键字,所以C++是非常有效的,在C++中,使用C++特定的关键字作为标识符是完全有效的。 例如(见现场演示) #包括 #布拉格海湾合作委员会毒药新 内部主(空) { int new=5;//oops编译器错误使用有毒标识符new。 printf(“

一般来说,它指的是使一个函数不可用,例如,如果你想禁止在程序中使用动态分配,你可以“毒害”malloc函数,使其不能使用“中毒”标识符意味着在“中毒”之后对标识符的任何引用都是硬编译器错误

例如(见现场演示)

<>这也可以用于C++中,因为C++中有很多关键字,所以C++是非常有效的,在C++中,使用C++特定的关键字作为标识符是完全有效的。 例如(见现场演示)

#包括
#布拉格海湾合作委员会毒药新
内部主(空)
{
int new=5;//oops编译器错误使用有毒标识符new。
printf(“%d”,新);
}

但是要使用这个指令,我们需要使用pragma指令,它是实现定义的。幸运的是,由clang重新定义的GCC pragma也能很好地工作。但是如果我有VC++编译器(MicrosoftVisualStudio),那么需要哪个pragma呢。如何在VC++编译器中执行此操作?

MSVC++有两种方法。获取您将使用的GCC版本。这将生成警告C4995,您可以使用/WX将其转换为错误

但是,不管您指定的名称是否有任何标识符,它都没有足够的选择性来防止C++成员上的警告发生相同的标识符名称。例如,您不能使用它来反对特定的函数重载。用第二种方法解决


一般来说,为了避免意外匹配,您更喜欢后者。但是请注意,它有一个鸡和蛋的问题,您只能弃用编译器知道的函数。强迫你,比如说,#包含一个你根本不想使用的标题。

你试过阅读和搜索微软的大量在线文档吗?@SamVarshavchik:是的,但没有找到我的答案。
#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);
}
#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
}
#include <stdio.h>
#pragma GCC poison new
int main(void)
{
     int new=5;     // oops compiler error use of poisoned identifer new.
     printf("%d",new);
}