语法和语义错误之间的歧义

问题描述

对于 C/C++ lang,有一个约束,即数组中的每个元素都必须具有相同的类型。所以如果我们用多种类型的元素初始化一个数组,就会发生错误。这是语法/语法还是语义错误

解决方法

C 词法分析或语法中没有任何内容将 intvoid 区分开来。这两者在 C 语法中只出现一次,在 C 6.7.2 1 中作为类型说明符。因此,区分这两个代码示例的唯一方法:

void *x[] = { (char *) 0 };

int *x[] = { (char *) 0 };

是通过使用代码的含义,如 C 标准在约束和其他文本中给出的。它们实际上由编译器区分,因为第一个被接受而不抱怨类型,但第二个导致对数组元素初始化程序类型的抱怨。因此,这是一个语义错误。