为什么隐式free的声明在llvm中采用vararg参数

Why implicit free's declaration is taken vararg parameter in llvm

采取以下代码

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,明明声明是从头文件中取出来的,但是为什么implicit free的声明不一样呢?

在 C 中(当有效的 C 标准允许时)函数的隐含类型 foo 原型或定义是 int foo(),这在 C 中意味着 接受未指定参数的函数,返回 int。 从 C99 开始,函数的隐式声明是非法的,并且在 C++ 中始终是非法的。

如果您使用这些选项准确编译该代码,您将会看到 mallocfree 的隐式声明的警告,尽管它们 不要说清楚隐含的类型是什么。如果你用 clang++ 而不是 clang 编译,你会看到两个 errors.