4

パラメータで構造体を渡すことは可能ですか?

C abiと互換性がありますか?

[編集]

基本的に、2つのメンバーを含むC ++ POD(構造は、ポインターと整数を持つファットポインターになります)が必要であり、この構造を呼び出し命令の関数パラメーターとして渡すことができます(Cを呼び出す場合でも)コード)。

現在、ファットポインターを使用していません(ポインターと整数はそれぞれ異なる関数パラメーターにあります)。かなり大きなリファクタリングを開始する前に、それが可能かどうかを知りたいです。

4

2 に答える 2

3

あなたはこれを行うことができます。

CコードをコピーしてLLVMのオンラインデモ( http://llvm.org/demo/index.cgi)に貼り付けることにより、サンプル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
}

呼び出し元の関数は構造体のコピーを作成し、そのコピーのアドレスを渡します。

于 2012-10-06T02:34:09.790 に答える
-2

絶対にできます。次に例を示します。

struct MyStruct_t {
    char *charPointer;
    int number;
};

void myFunction(MyStruct_t myStructAsParam) {

    printf("String: %s, Number: %i", myStructAsParam.charPointer, myStructAsParam.number);
    // Your stuff here.
}
于 2012-10-06T01:58:50.650 に答える