質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

C言語のファイルでObjective-Cのメソッドを呼び出す方法がわかりません

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,259

ababab

score 57

Xcodeで、C言語のファイルとObjective-Cのファイル(cocoa-touch)を使ってアプリを作っています。

C言語のファイル(ファイル名.c)にはCの書き方でメソッドが書かれており、
Objective-Cのファイル(ファイル名.hとファイル名.m)にはObjective-CとCの両方のメソッドが書かれています。

ここで言う「Cの書き方で書かれたメソッド」とは
void function(int){

}
のような形で、「Objective-Cの書き方で書かれたメソッド」とは
-(void) function{

}
のような形です。

今やりたいことは、
C言語のファイルで、Objective-Cのファイルに書かれたメソッドを呼び出すということです。

C言語のファイル(◯◯.c)

int function(){
   function2(1);
}
Objective-Cのファイル(◯◯.m)

int function2(){
   int i;
   i = i + 1;
   return i;
}
という形で書きたいのですが、
C言語のファイルでObjective-Cのファイルに書かれたメソッドを呼び出す方法がわからず困っています。
Cなら「 関数名() 」、Objective-Cなら「 [self 関数名]」のように書きますが、
この場合どのように書けば良いでしょうか?

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ababab

    2015/08/09 22:09

    申し訳ありません。"include...の部分は間違って見ていました...
    Objective-Cのファイルに書かれているCの記述では
    void function{
    frontend *fe = (frontend *)handle;
    GameView *gv = (__bridge GameView *)(fe->gv);
    ...
    でUIViewファイルを呼び出していました。

    キャンセル

  • Stripe

    2015/08/09 22:18

    Objective-Cファイル側ではなく、Cファイル側ではどのようにObjective-Cのインスタンスを取り扱ってますか?あと、そもそも、なぜCファイルとObjective-Cファイルが混在しているんですか?

    キャンセル

  • ababab

    2015/08/09 22:27

    CでObjective-Cファイル名の記述がありませんでした...
    なぜ混在しているのかは謎です。

    キャンセル

回答 2

+1

.mに書かれているのはC言語形式の関数ですか?
その場合はお互いの関数がexternで宣言されていれば呼び合うことはできます。

extern int function2();

int function1()
{
    return function2();
}

extern int function1();

int function2()
{
    return 1;
}

void call()
{
    printf("%d", function1());
}

C言語側から呼び出される.mの関数がメンバ関数である場合は話が違ってきます。
selfを__bridgeでvoid*などにキャストしてC言語側で保存、.m側が呼び出されたらselfを復元する、といった方法が必要です。
↓が参考になるかと
C関数ポインタにObjective-Cデリゲートを渡す

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/10 01:03

    externは不要では?

    キャンセル

  • 2015/08/10 12:10

    externは無くても同じように解釈されますけど僕はソース外を明示するためにつけるようにしてます。

    キャンセル

  • 2015/08/10 14:46

    Objective-Cの形式( -(void) function{ } )で書かれた関数をC言語形式のコードで呼び出すにはどう書いたらよろしいのでしょうか?
    また、Objective-Cの関数をextern付きで書くことは必要でしょうか?

    キャンセル

  • 2015/08/10 17:11

    C言語のソース内でObjective-Cのメンバ関数を直接呼び出すことはできません。C言語にそのような機能がないからです。
    Objective-Cのソース内でC言語の関数を直接呼び出すことはできます。Objective-CがC言語の上に成り立っているためそういう機能があるからです。
    ただし、Objective-CはC言語と同じ形式の関数を外部に公開することができ、この関数はC言語から呼び出すことができます。

    C言語   |  Objective-C
    関数<--+ー--メンバ関数  ○
    関数ーーー+ーー>メンバ関数  ×
    関数ーーー+ーー>関数     ○
         |

    ですので、↑で参考に挙げたブログがそうしているようにC言語の関数からObjective-Cのメンバ関数を呼ぶにはObjective-C内にC言語形式の関数を作ってメンバ関数を呼び出すブリッジ機能を持った関数が必要になります。

    C言語   |   Objective-C
    関数<--+--メンバ関数
     |   |   ↑
     +ーーー+ー> 関数
         |

    > また、Objective-Cの関数をextern付きで書くことは必要でしょうか?

    ”extern”はあってもなくても同じように解釈されるので重要ではなく、
    少なくともC言語側にObjective-C側にある関数のプロトタイプ宣言が必要になります。

    キャンセル

0

Cファイル(.c)とObjective-Cファイル(.m)を混在させている理由がないなら、全てのファイルをObjective-Cファイル(.m)にしてください。
Objective-CはCの上位互換なので、.mファイルの中にCのコードをそのまま書けます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/11 03:09

    あなたは、Objective-Cでプログラムを書いたことがないんですか?

    キャンセル

  • 2015/08/11 15:24

    書いたことはありますが、インスタンスというものについて気にして書いていないまたはそれがインスタンスだと知らずに書いていました...無知で申し訳ありません

    キャンセル

  • 2015/08/11 21:25

    とりあえず、Objective-Cをもっと勉強しましょう。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る