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

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

ただいまの
回答率

90.62%

  • C

    3557questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • 関数

    210questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,989

ababab

score 51

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/09 22:54

    CファイルをObjective-Cファイルに移すことができたのですが、Cのコード内でObjective-Cファイルのメソッドを呼ぶにはどのように書けば良いのでしょうか?

    キャンセル

  • 2015/08/09 23:00

    そのまま、Objective-Cの文法で書けます。

    キャンセル

  • 2015/08/10 14:47

    C言語形式のコードに" [self function()]; と書きましたが、selfのところで「Use of undeclared identifier 'self'」のエラーが出てしまいました。

    キャンセル

  • 2015/08/10 19:24

    前にも書いたとおり、Objective-Cのインスタンスをどのように取り扱っていますか?それが無いとObjective-Cのメソッドは呼び出せません。
    selfは@implementationの外側では使えません。同名の変数を定義して使うことはできますが。
    あと、[self function()];だと文法エラーになります。正しくは[self function];

    キャンセル

  • 2015/08/10 23:59

    インスタンスについて知らなかったので調べたのですがなかなか理解できず....
    例えばどのような形で取り扱われているべきなのでしょうか...?

    キャンセル

  • 2015/08/11 03:09

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

    キャンセル

  • 2015/08/11 15:24

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

    キャンセル

  • 2015/08/11 21:25

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

    キャンセル

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

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

関連した質問

  • 解決済

    [Objective-c]現在時刻と前回測定時刻の差を求めたい。

    5秒、10秒、20秒などの時間間隔でGPSデータを取得するアプリを作成中なのですが、 前回測定時刻から、時間間隔以上経過したら、緯度・経度を取得する処理をしたいと考えています。変数

  • 受付中

    Objective-CによるiOSアプリ開発でわからない点があります。

    こんにちは。Objective-CでiOSアプリの勉強をしています。 インターフェースビルダーは使っていません。 簡単なストップウォッチをつくろうとしているのですが、わからない点が

  • 解決済

    didSelectRowAtIndexPathでNSMutablearrayでaddobjectする...

    いつもお世話になっております。  題名の件ですが、viewdidload内でNSMutablearrayを初期化して,UITableVIewのdidSelectRowAtInde

  • 解決済

    エラー

    このようなエラーが出ているのですが、どうすれば解決しますか?

  • 受付中

    計算機の計算がおかしい

    計算機をとりあえず、数字の1と2のボタンを作ってみたのですが、エミュレーターで試してみると、1のボタンを押したときに100000000・・・みたいな意味不明な数字がでてきてしまいま

  • 受付中

    計算機のエラー

    ボタンを押したら計算した結果がラベルに表示されるというものを作りたいのですが、意味のわからないエラーが出てきます・・・改善方法を教えてください。

  • 受付中

    オブジェクト指向でクラスを作成する際の考え方について

    いつもお世話になっております。 オブジェクト指向プログラミングについて勉強中の者です。 表題の件ですが、オブジェクト指向プログラミングをするにあたってクラスを作成する時があ

  • 解決済

    iosアプリ(swift/Object-C)でデフォルトゲートウェイのIPアドレスを取得

    iPhone(ios)のアプリのプログラム(swift/Object-C)でデフォルトゲートウェイのIPアドレスを取得したいですが、やり方がわかりません。 色々調べてやってみ

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

  • C

    3557questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Objective-C

    1172questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • 関数

    210questions

    関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。