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

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

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

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

Q&A

解決済

3回答

1718閲覧

C/C++ 構文の意味を教えてください

moonYong

総合スコア14

C

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

0グッド

0クリップ

投稿2019/10/12 22:39

お世話になっています。
以下のURLで mbed という組み込みOSに関連する話です。

https://os.mbed.com/docs/mbed-os/v5.9/reference/mutex.html

Thread t2;

t2.start(callback(test_thread, (void *)"Th 2"));

void test_thread(void const args) {
while (true) {
notify((const char
)args, 0); wait(1);
notify((const char*)args, 1); wait(1);
}
}

t2.start() によって test_thread() が実行されるのだろうという想像はできます。
Threadのところの説明を見ると、start()メソッドの構文は以下のようになっています。

https://os.mbed.com/docs/mbed-os/v5.14/mbed-os-api-doxy/classrtos_1_1_thread.html

(1) start (mbed::Callback< void()> task)
(2) start (T *obj, M method)

上の例の場合、start()の引数がひとつなので(1)の構文が使われているのでしょうか?

mbed::Callback< void()> task の部分の意味が理解できないので、教えていただけないでしょうか?

また、t2.start(callback(test_thread, (void *)"Th 2")); のところの

callback (先頭の c が小文字)はどこから来たキーワード?なのでしょうか?

初心者なので、わかりやすく教えていただけると助かります。
よろしくお願いします。

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

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

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

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

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

raccy

2019/10/12 22:44

「テンプレート」は知っていますか?
moonYong

2019/10/12 23:46

raccyさま 返信ありがとうございます。 本で少し読んだ程度ですけれど 関数テンプレート クラステンプレート の簡単な知識はあります。
guest

回答3

0

callback (先頭の c が小文字)はどこから来たキーワード?なのでしょうか?

おっそろしく長いヘッダ"Callback.h" に定義されています。

投稿2019/10/12 23:06

episteme

総合スコア16614

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

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

moonYong

2019/10/12 23:54

epistemeさま 返信ありがとうございます。 ありました、でも内容を理解することができませんでした。 テンプレートの勉強不足でしょうか。。
episteme

2019/10/13 00:05

callback(test_thread, (void *)"Th 2") は、 test_thread("Th 2") をcallする mbed::Callback< void()> を返し、 そいつが生成されたスレッドの中で動くんでしょね。
guest

0

こんにちは。

callbackは多数のオーバーロード関数がある可変長引数テンプレート関数ですね。恐らくCallback.hの792行目からの下記です。(そっくりのものが多数あり目がチラチラするので違っていたらごめんなさい。)

C++

1/** Create a callback class with type inferred from the arguments 2 * 3 * @param func Static function to attach 4 * @param arg Pointer argument to function 5 * @return Callback with inferred type 6 */ 7template <typename T, typename U, typename R, typename... ArgTs> 8Callback<R(ArgTs...)> callback(R(*func)(const T *, ArgTs...), const U *arg) 9{ 10 return Callback<R(ArgTs...)>(func, arg); 11}

callback(test_thread, (void *)"Th 2")の呼び出しによる型推論で、T=void、U=void、R=void、ArgTs=空へ展開されていると思います。
その結果、Callback<void()> callback(void(*func)(const void*), const void *arg)というシグニチャになっている筈です。funcはconst void*を引数とし、戻り値がvoidの関数ポインタです。

可変長引数テンプレートを使っているので、Mbed OSはC++11以降準拠でしょうから、std::threadやstd::functionを実装すればよいのにとか思ってしまいますが、過去との互換性問題があるのかも知れませんね。

投稿2019/10/13 05:00

Chironian

総合スコア23272

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

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

moonYong

2019/10/13 07:08

Chironianさま お返事ありがとうございました。
guest

0

ベストアンサー

(1) start (mbed::Callback< void()> task)

mbed::Callback< void()> 型の変数を一つ取る、関数定義ですね

callback はどこかで定義されてるんじゃないでしょうか。そっちを探してみましょう

投稿2019/10/12 22:52

y_waiwai

総合スコア87749

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

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

moonYong

2019/10/13 00:36

y_waiwaiさま 返信ありがとうございます。 Callbackはクラスであることがわかりました。 <void()> の部分がよく理解できません。
episteme

2019/10/13 00:39

「"引数なしで呼び出され、戻り値がvoidであるナニか(関数オブジェクト)"を現すテンプレート引数」です。
y_waiwai

2019/10/13 00:56

<なんたら>は、なんたら型を引数に取る定義とかんがえればわかりやすい、、かな? まずはCallbackの定義を見てみることですが、まずはそこらへんの基本的な知識をつけることですね。
moonYong

2019/10/13 01:33

epistemeさま, y_waiwaiさま 返信ありがとうございます。 <>を含んだ文字列が検索できないみたいで、なかなか探すことができません。 <>を含んだ文字列の場合、持っている本には <class X> か <typename X> の例しかありません。 ですから <void()> について理解ができませんでした。
y_waiwai

2019/10/13 01:41

まずは、「C++ テンプレート」でぐぐりましょう 出てきたものを一通り読んで、わからないことがあれば聞いてください
episteme

2019/10/13 01:46

void() は型です。 「<typename X> の例しかありません」のXとして指定されてるってことです。
moonYong

2019/10/13 02:09

epistemeさま 返信ありがとうございます。 なるほど~、理解しました。 でも、void はわかりますけど、void()がわかりません。 void() で検索しても出てこないのですけれど・・・ どちらか参考になるサイトをご存じでしたら教えてください。 よろしくお願いします。
episteme

2019/10/13 02:46 編集

"引数なしで呼び出され、戻り値がvoidであるナニか"の型です。 #include <iostream> typedef void X(); void call(X x) { x(); } void hello_fn() { std::cout << "Hello, world\n"; } int main() { call(hello_fn); auto hello_lambda = []() { std::cout << "Hello, world\n"; }; call(hello_lambda); }
moonYong

2019/10/13 04:30

epistemeさま たびたび返信ありがとうございます。 typedef void X(); これは、 void = X() だよ という意味なのでしょうか? そしたら X() は何?って、ますますわからなくなってしまいました。
episteme

2019/10/13 04:42 編集

当初のあなたの質問どおり、 X は void() です。 > そしたら X() は何?って、ますますわからなくなってしまいました。 わからなくてアタリマエ。 Xは型です、intと同様。 そしたら int() は何? って疑問は ”わからなくてアタリマエ” でしょ?
moonYong

2019/10/13 05:08

epistemeさま 返信ありがとうございます。 typedef void X(); は void を X() と同じ意味にするのではなく void() を X と同じ意味にするのでしょうか? どうして()がvoidの方にくっついてしまうのかわかりません。
y_waiwai

2019/10/13 05:13

関数、の型です。 返り値を持たない、引数を持たない関数、の型ですね void uniuni(void) {  なんやかや } typedef void X(void); X f; f=uniuni; f(); // なんやかやが実行される
episteme

2019/10/13 06:09

> どうして()がvoidの方にくっついてしまうのかわかりません。 「そーゆーきまりごとだから」としか...
moonYong

2019/10/13 07:08

y_waiwaiさま epistermさま お返事ありがとうございました。 もっと勉強して理解するようにがんばります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問