今天做程序设计的作业时又看见一题,让使用char*实现一个"String"类(与std::string相似),但是要求上传的String类的.cpp实现代码却没有禁用string,导致一些函数直接可以先转换为string对象,用string提供的函数实现以后再转换回char*……然后就想应该可以用#pragma GCC poison来实现禁用string,但是同时也想到,因为#define和#pragma GCC poison都是预处理器来处理的,会不会使用#define能实现绕过#pragma GCC poison呢?实验表明在一些情况下是可以的,如下面两段代码
#include<iostream>
#pragma GCC poison string
#define youknow string
int main() {
std::youknow str;
return 0;
}
#include<iostream>
#define youknow string
#pragma GCC poison string
int main() {
std::youknow str;
return 0;
}
差别仅仅在于互换了#pragma GCC poison与#define,真是奇怪……一搜索,发现原来这是#pragma GCC poison的一个特性