采用以下代码
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的声明不同?
答案 0 :(得分:2)
在C中(如果有效的C标准允许),函数foo
的隐含类型在没有先验的情况下被调用
原型或定义为int foo()
,在C中表示带有未指定参数的函数,返回int 。
从C99开始,隐式声明函数是非法的,在C ++中始终是非法的。
如果使用这些选项完全编译了该代码,您将看到
malloc
和free
隐式声明的警告,尽管它们
不清楚隐式类型是什么。如果使用clang ++而不是clang进行编译,则会看到两个错误。