是否可以通过参数传递结构?
它与 C abi 兼容吗?
[编辑]
基本上,我想要一个 C++ POD,它包含两个成员(结构将是一个胖指针,带有一个指针和一个整数),并且能够在调用指令中将此结构作为函数参数传递(即使在调用 C代码)。
我现在不使用胖指针(指针和整数都在不同的函数参数中),我想知道在开始相当大的重构之前是否有可能!
你可以这样做。
您可以通过将 C 代码复制并粘贴到位于http://llvm.org/demo/index.cgi的 LLVM 在线演示中来找出示例 C 的 LLVM 代码是什么。
如果您复制并粘贴 codepad.org 中的代码,您将看到 LLVM 为 myFunction 生成以下内容:
define void @_Z10myFunction10MyStruct_t(i8* %myStructAsParam.coerce0, i32 %myStructAsParam.coerce1) nounwind uwtable {
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str, i64 0, i64 0), i8* %myStructAsParam.coerce0, i32 %myStructAsParam.coerce1)
ret void
}
当然,如果您查看电话,您会注意到没有复制。这取决于调用函数。如果我们写一个小的 C 函数:
void myCallingFunction(MyStruct_t *foobar)
{
myFunction(*foobar);
}
我们可以看到为 myCallingFunction 生成的 LLVM 位码是:
define void @_Z17myCallingFunctionP10MyStruct_t(%struct.MyStruct_t* nocapture %foobar) nounwind uwtable {
%foobar.0 = getelementptr inbounds %struct.MyStruct_t* %foobar, i64 0, i32 0
%tmp = load i8** %foobar.0, align 8
%foobar.1 = getelementptr inbounds %struct.MyStruct_t* %foobar, i64 0, i32 1
%tmp1 = load i32* %foobar.1, align 8
%1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str, i64 0, i64 0), i8* %tmp, i32 %tmp1) nounwind
ret void
}
调用函数制作结构的副本,然后传入副本的地址。
绝对可以。这是一个例子:
struct MyStruct_t {
char *charPointer;
int number;
};
void myFunction(MyStruct_t myStructAsParam) {
printf("String: %s, Number: %i", myStructAsParam.charPointer, myStructAsParam.number);
// Your stuff here.
}