私はパーサーを書いていますが、キャストするときに、通常のクラス型と配列クラス型を区別するのに苦労しています。
次のようなものがあると、非常に役立ちます。
if (expression causes segmentation fault)
do sth
else
do sth else
そうでない場合、2 つのクラスを互いに区別する良い方法は何でしょうか?
if (base->type->GetType() != "") {
char *key = strcpy(key, base->type->GetType().c_str());
Node *node = (stack->front).Lookup(key);
if (node != NULL) {
theclass = dynamic_cast<ClassDeclaration *>(node);
}
if (!base->GetType()->IsEquivalentTo(GetType()))
errReport.FieldNotFoundInBase(field, type);*/
if (theclass->id->name){ // segfault happens here.
- 変数 theclass は、実際のクラスとして初期化されることもあれば、配列として初期化されることもあります。
if (theclass->id->name) {
配列クラスには実際には名前フィールドがないため、実際のクラスではなく配列クラスがある場合、セグフォルトが行で発生します。クラス変数がどの型で初期化されているかを知る方法は実際にはありません。