重新定义(#define)保留的c++关键字

Redefine(#define) reserved c++ key word

本文关键字:c++ 关键字 保留 #define 定义 新定义      更新时间:2023-10-16

是否可以使用#define重新定义c++关键字?

#ifdef int
#undef int 
#define int 2
#endif
int main(){
    //Do something with int
}

我看不到这种情况下的输出,但我想了解内部发生了什么。我没有#define的原因是,我发现如果不使用标准头文件,就可以#定义保留关键字。我还尝试运行以下代码。

#include<iostream>
using namespace std;
#ifdef int
#undef int 
#endif
int main(){
    cout<<int;
}

但是上面的te在cout线上抛出了错误。

有可能吗?对它的风格好吗?绝对不是。

预处理器不知道C/C++关键字,只知道预处理器令牌,只做严格的文本替换。

你的例子导致了一个错误,因为你正在对它进行#undef定义。一旦你对它进行了取消定义,它就会恢复到以前的行为。

我所知道的做这样事情的唯一有效用途是解决旧编译器中的一个错误,而这个编译器现在已经不再相关了。

从技术上讲,它是有效的,但可能对你没有多大好处。如果您想使用标准C++库,则不允许根据17.6.4.3.1[宏名称]第2段:定义任何关键字或任何其他名称

翻译单位不得对与关键字、表3中列出的标识符或7.6中描述的属性标记在词汇上相同的名称进行#定义或#取消定义。

您可以,但不应该。

在您的示例中,int没有被重新定义,因为它被封装在#ifdef int中。这意味着"只有在已经有一个名为int的预处理器宏的情况下才能执行此操作",而事实并非如此。

如果您刚刚编写了#define int 2,那么所有出现的int都将被2替换;但是由于2 main() {cout<<2;}是无稽之谈,因此您的代码无法编译。

#undef不会从语言中删除关键字;它仅移除先前使用CCD_ 10定义的预处理器宏。

如果你不使用标准库,你可以这样做。事实上,预处理器不应该区分保留字和非保留字。

然而,这可能不是你遇到问题的原因。首先,你的例子并不像你想的那样。故障在于int通常不是预处理器定义的宏。因此,#ifdef int指令将跳过以下行直到终止#endif

这意味着你的第二个例子扩展到:

// stuff from iostream and possibly other headers 
int main(){
    cout<<int;
}

故障是根本不允许CCD_ 14。