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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

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

C

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

関数

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

Q&A

2回答

7234閲覧

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

ababab

総合スコア47

Objective-C

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

C

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

関数

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

0グッド

0クリップ

投稿2015/08/09 12:09

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 関数名]」のように書きますが、
この場合どのように書けば良いでしょうか?

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/08/09 12:19

Objective-Cのメソッドを呼ぶにはインスタンスが必要ですが、C言語のファイルではどのようにインスタンスを取得してますか?
ababab

2015/08/09 12:34

サンプルコードをいじっているのでよくわからないのですが、「#include "objective-Cのファイル名.h"」が最初に書かれてあります...
Stripe

2015/08/09 12:50

C言語からObjective-Cのヘッダーは#includeできません。また、Objective-Cのインスタンスっていうのは、[self function];のselfの部分のことです。
ababab

2015/08/09 13:09

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

2015/08/09 13:18

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

2015/08/09 13:27

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

回答2

0

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

C

1extern int function2(); 2 3int function1() 4{ 5 return function2(); 6}

Objective

1extern int function1(); 2 3int function2() 4{ 5 return 1; 6} 7 8void call() 9{ 10 printf("%d", function1()); 11}

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

投稿2015/08/09 15:47

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/08/09 16:03

externは不要では?
toki_td

2015/08/10 03:10

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

2015/08/10 05:46

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

2015/08/10 08: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側にある関数のプロトタイプ宣言が必要になります。
guest

0

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

投稿2015/08/09 13:38

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ababab

2015/08/09 13:54

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

2015/08/09 14:00

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

2015/08/10 05:47

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

2015/08/10 10:24

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

2015/08/10 14:59

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

2015/08/10 18:09

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

2015/08/11 06:24

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

2015/08/11 12:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問