0

是否可以使用#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 行抛出错误。

4

4 回答 4

2

是否可以?是的。是不是很好的风格?绝对不。

预处理器不知道 C/C++ 关键字,它只知道预处理器标记并且只进行严格的文本替换。

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

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

于 2012-08-23T22:26:52.070 回答
1

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

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

于 2012-08-23T22:33:03.813 回答
0

可以,但你不应该。

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

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

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

于 2012-08-23T22:28:27.683 回答
0

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

但是,这可能不是您遇到问题的原因。首先,您的示例并没有按照您的想法进行。错误在于int通常不是预处理器定义的宏。因此,该#ifdef int指令将跳过以下几行直到终止#endif

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

// stuff from iostream and possibly other headers 

int main(){
    cout<<int;
}

错误是cout<<int;根本不允许这样做。

于 2015-12-16T15:29:14.590 回答