重新定义(#define)保留的c++关键字
Redefine(#define) reserved c++ key word
是否可以使用#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。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字