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

时间:2012-08-23 22:19:03

标签: c++

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

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

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

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

但是上面的te会在cout line处抛出错误。

4 个答案:

答案 0 :(得分:2)

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

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

您的示例导致错误,因为您#undef了它。一旦你取消定义它,它就会恢复到以前的行为。

我知道这样做的唯一有效用途是work around a bug in an old compiler,而且这些编译器现在已经不再适用了。

答案 1 :(得分:1)

从技术上讲它可行,但它可能对你没什么好处。如果要使用标准C ++库,则不允许根据17.6.4.3.1 [macro.names]第2段定义任何关键字或任何其他名称:

  

翻译单元不得#define或#undef名称与关键字词汇相同,表3中列出的标识符或7.6中描述的属性标记。

答案 2 :(得分:0)

可以,但你不应该。

在您的示例中,int未被重新定义,因为它包含在#ifdef int中。这意味着“只有在已经有一个名为int的预处理器宏”时才会这样做,而且没有。

如果你刚写了#define int 2,那么int的所有出现都会被2取代;但是你的代码不会编译,因为2 main() {cout<<2;}是无意义的。

#undef不会从该语言中删除关键字;它只删除以前使用#define定义的预处理器宏。

答案 3 :(得分:0)

如果您不使用标准库,则允许这样做。事实上,预处理器不应区分保留字和非保留字。

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

这意味着您的第二个示例扩展为:

// stuff from iostream and possibly other headers 

int main(){
    cout<<int;
}

错误是cout<<int;根本不被允许。