什么是测试标识符没有被截断并因此混淆的好方法?

Mos*_*she 4 c++ compiler-construction unit-testing language-design

在今天的C++类中,我们讨论了标识符的最大可能长度,以及编译器在一定长度后如何最终停止将变量视为不同的变量.(我的教授似乎暗示真正的长标识符被截断了.)我之前发布了另一个问题,希望看看是否在某处定义了限制.我的问题有点不同.假设我想测试标识符名称长度的实际或强制限制.我该怎么做呢?这是我正在考虑的事情,但不知何故,它似​​乎太简单了.

  • 步骤1:使用非常长的名称生成至少两个变量并将其打印到控制台.如果标识符名称确实无限制,我不会浪费时间输入它们.我的代码应该为我做.
  • 步骤2:尝试使用变量执行某些操作,例如比较它们或任何算术.如果编译器停止区分,那么理论上,某些算法会中断,例如x/(reallyLongA-reallyLongB),因为reallyLongA并且reallyLongB将会很长,以至于编译器只会将它们视为同一个东西.在这一点上,分裂操作将变为零分割,这应该崩溃并且可怕地燃烧.

我接近这个吗?在"打破"编译器或"运行时"之前,我是否会耗尽内存?

ASh*_*lly 5

我认为您甚至不需要对变量生成任何操作.

以下代码将在编译时生成重定义错误;

int name;
int name;
Run Code Online (Sandbox Code Playgroud)

我希望你会得到同样的错误

int namewithlastsignificantcharacterhere_abc;
int namewithlastsignificantcharacterhere_123;
Run Code Online (Sandbox Code Playgroud)

我会使用脚本语言来连续生成更长的名称,直到你有一个破坏.这是一个Ruby单线程

C:> ruby​​ -e"(1..2048).each {| i | puts \"int#{'variable'*i}#{i}; \"}"> var.txt

当我在ac文件中#include var.txt,并使用VS2008编译时,我收到错误

"1> c:\ code\quiz\var.txt(512):致命错误C1064:编译器限制:令牌溢出的内部缓冲区"

和JRL引用的4096是512*8个字符.