为什么在llvm中采用隐式自由声明vararg参数

问题描述 投票:1回答:1

采取以下代码

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的声明不同?

clang llvm-clang llvm-ir
1个回答
2
投票

在C中(当操作C标准允许时)在没有先前原型或定义的情况下调用的函数foo的隐含类型是int foo(),其在C中表示函数采用未指定的参数,返回int。从C99开始,隐式声明函数是非法的,在C ++中始终是非法的。

如果您使用这些选项准确编译了该代码,您将看到mallocfree的隐式声明的警告,尽管他们没有说明隐含类型是什么。如果用clang ++而不是clang编译,你会看到两个错误。

© www.soinside.com 2019 - 2024. All rights reserved.