#pragma GCC poison 的一个有趣特性

本文探讨了在C++编程中如何使用#pragma GCC poison来禁用特定标识符,以防止类型转换。作者通过实验发现,该指令在某些情况下允许宏定义绕过,并指出#pragma GCC poison应在#include系统头文件之后尽早使用。文章强调了预处理器的强大,并提到补充C和C++参考知识的重要性。
摘要由CSDN通过智能技术生成

今天做程序设计的作业时又看见一题,让使用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的一个特性

http://gcc.gnu.org/onlinedocs/gcc-3.2/cpp/Pra

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值