Как отравить идентификатор в 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 ++?