【发布时间】:2014-05-13 18:44:44
【问题描述】:
我正在用 C++ (C++98) 手动编写编译器,并正在寻找反馈/想法应该如何处理以下情况(请参阅标题,了解数组的语法应该是什么样的):
{
int b;
int m, n;
int a[n];
b = a[b*m]; (1)
}
边界检查、运行时堆栈扩展(以及离开范围时缩小)等,都可以在我的框架中很好地处理。
我的问题与在使用未初始化变量的情况下发出警告有关,如上面的 (1) 所示。如果 a 是在初始化之前使用的整数变量,我允许它,但会发出警告消息。因为我想让编译器准备好以后可能有一个链接器,所以向后计算 b 和 m 并实际检查 a 的这个索引是否已经初始化(例如,在最一般的情况下,一个变量可以定义在不同的文件)。如前所述,我知道如何在运行时发出代码来进行边界检查;但是……
...什么是扩展发出警告的最佳实践方法,当使用未初始化的变量时,此变量的形式为 a[(expr)]?由于 (expr) 不必是整数值(仅仅是一个数字;它只需要是整数类型),无需评估 (expr) (我不想像上面所说的那样做),我不能比如说,保留一个影子数组,其中的条目标记为已初始化。在 (gcc) C 中,这种情况被简单地忽略了:发出 b 和 m 都未初始化的警告,但与使用未初始化的变量 a[b*m] 无关。这显然符合 C 对数组的看法,并且在 C 中(但不是我正在研究的语言,它没有指针的概念)除了 b 和 m 之外,表达式是明确定义的未初始化,并且访问(可能)超出范围(即将发生堆栈溢出)。
最好的做法是在使用前不检查 a[(expr)] 是否已初始化;发出代码;并等待运行时错误(如果有)?还是……?
【问题讨论】:
-
没有 C++99。 C99?
-
@deviantfan: :) C++11 之前的版本(我的 gcc 对 C++11 的支持参差不齐 - 我正在运行并且没有更新大约 Ubuntu 12.04 时间版本的 gcc)跨度>
-
C++11 之前的版本(不包括 TR)是 C++03。但是:C++ 没有可变长度数组(C99 有。(不禁止在 C++ 中添加它们))。 ...您应该知道您正在为哪种语言制作编译器...
-
@deviantfan:(1)目标语言类似于Java; (2) 开发语言为C++; (3) 所有对 C(或除上述两种语言之外的任何语言)的引用都只是示例。
标签: c++ arrays compiler-construction compiler-warnings