将指针转换为void

时间:2015-10-14 14:23:43

标签: c pointers void

以下两种铸件有什么不同吗?

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.(显然我误解了一些事情)

2 个答案:

答案 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类型的指针,这是一个完整的类型,应该在您的程序中使用。在这种情况下,编译器会正确地报告表达式中对象的不使用。