采取以下代码
int main() {
int* a = (int*) malloc(sizeof(int) * 10);
free(a);
return 0;
}
如果由clang -S -emit-llvm -O0 -g
将其编译为llvm IR,则free的声明为:
declare i32 @free(...) #2
但是,如果我添加#include <stdlib.h>
,free的声明是:
declare void @free(i8*) #2
通过添加include,声明显然取自头文件,但为什么隐式free的声明不同?
在C中(当操作C标准允许时)在没有先前原型或定义的情况下调用的函数foo
的隐含类型是int foo()
,其在C中表示函数采用未指定的参数,返回int。从C99开始,隐式声明函数是非法的,在C ++中始终是非法的。
如果您使用这些选项准确编译了该代码,您将看到malloc
和free
的隐式声明的警告,尽管他们没有说明隐含类型是什么。如果用clang ++而不是clang编译,你会看到两个错误。