以下两种铸件有什么不同吗?
int a=10;
int *p=&a;
(void)p; //does not give any warning or error
或
(void *)p; //error: statement with no effect [-Werror=unused-value]
遵守gcc -Wall -Werror --std=c99 -pedantic
Just saw that in this answer.(显然我误解了一些事情)
答案 0 :(得分:14)
当你这样做时
def extraiNormalize(nameFile):
file = open(nameFile, 'rU')
questions = []
for line in file:
field = re.search(r".*User Input:\s*([A-Za-zÀ-ú\s]+[\?])$", line)
if field is not None:
quest = field.group(1)
questions.append(quest)
file.close()
print_list(questions)
您告诉编译器只是忽略表达式(void) p;
的结果。它实际上与空语句相同:
p
当你这样做时
;
您告诉编译器将变量(void *) p;
视为通用指针,并且它是语句的完整表达式,这个表达式并没有真正做任何事情而且您得到了错误消息。
答案 1 :(得分:11)
是的,很明显。
(void)p;
表示对象被转换为void
类型(不是完整类型)并且作为完整表达式,不应使用表达式的结果,因此编译器不会检查它&# 39;用法。
引用C11
标准,第6.3.2.2章,void
void
表达式(具有void类型的表达式)的(不存在)值不应 以任何方式使用,[......]如果任何其他类型的表达式被评估为void
表达式,其值或指示符被丢弃。
因此,不会产生任何警告或错误。
OTOH,
(void *)p;
表示该对象是指向void
类型的指针,这是一个完整的类型,应该在您的程序中使用。在这种情况下,编译器会正确地报告表达式中对象的不使用。