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

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

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

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

Q&A

解決済

3回答

1034閲覧

配列の後ろの型の意味がわかりません

dokunira

総合スコア2

C

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

1グッド

1クリップ

投稿2023/07/03 01:25

編集2023/07/03 01:35

「12ステップで作る組み込みOS自作入門」という本のコードを写経しているのですが、割り込みベクタの設定ファイルの配列名の後ろの型の記述の意味がわかりません。

C

1#include "defines.h" 2 3extern void start(void); /* スタート・アップ */ 4 5/* 6 * 割込みベクタの設定. 7 * リンカ・スクリプトの定義により,先頭番地に配置される. 8 */ 9void (*vectors[])(void) = { 10 start, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 11 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 12 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 13 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 14 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 15 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 16 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 17 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 18};

vectorがポインタ型の配列で、関数のポインタを入れることで、割り込み時にその関数に処理が飛ぶようになっているようですが、配列の後ろの(void)はなんのために書かれているのでしょうか。

(void)をなくしてコンパイルしてもエラーは出ず、h8writeでマイコンに書き込んでも正しく動作します。

配列の後ろに型が記述されているようなコードがネットで探しても見つからず、このような記述の意味がわかりません。ご教授願います。

tatsu99👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

配列の後ろの(void)

引数の型です.
関数ポインタの文法を調べると良いかと.

(void)をなくしてコンパイルしてもエラーは出ず

というのは,例えば関数を int f( void ); って書く場合と int f(); と書く場合とで,どっちもコンパイル通るのと一緒でしょう.

投稿2023/07/03 01:46

編集2023/07/03 01:48
fana

総合スコア11931

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

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

fana

2023/07/03 01:57 編集

要らない情報だろうとは思うけど, C言語の規格(バージョン?)によっては,引数の void の有無で違いが生じるとかいう話もある. (引数が無いなら void って書いとくのが良い…のかな) 気になるなら,例えば「C言語 引数 void 書く 書かない」とかそんな感じでググってみると良いかも.
dokunira

2023/07/03 01:58

回答ありがとうございます。 関数ポインタで調べてみました。関数ポインタには引数の指定も必要なんですね。
SaitoAtsushi

2023/07/03 02:56

void の有無で違うのは関数原型 (プロトタイプ) の有無です。 空の括弧を伴う関数宣言子は関数原型を含まないという扱いになります。 関数原型という言葉はこれ以外の場面で使う機会があまりないので情報を探すにあたって便利なキーワードだと思います。
fana

2023/07/03 03:07

補足どうもです. (他者の回答の方でコメントされていますが)この回答の内容を書くにあたっては,私も 「 void (*vectors[])() として,"void" を無くしても…」 という話だと想定したのですが, 実はそうではなくて,まさに質問文の記述の通りに "(void)" を取り払って 「 void (*vectors[]) と書いてもコンパイルが通る」という(別の)話だったようです.
guest

0

start 関数の宣言の括弧の中と同じです。

投稿2023/07/03 01:47

jimbe

総合スコア13088

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

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

0

関数の宣言の仕方です。
int f;はint型の変数を宣言。
int f(void);はint型を返す(引数無しの)関数を宣言。

(void)をなくしてコンパイルしてもエラーは出ず、h8writeでマイコンに書き込んでも正しく動作します。

void (*vectors[]) = {と書いたらエラーになるはずなので、↑は間違いで、実際は、

voidをなくしてコンパイルしてもエラーは出ず、

の間違いで、void (*vectors[])() = {と書いたのでは?
であれば、

int f();はint型を返す関数を宣言。引数については何も言及せず、コンパイル時に呼び出し側での引数の個数・型チェックを行わない。
int f(void);はint型を返す引数無しの関数を宣言したので呼び出し時に引数を書くとコンパイルエラー。

の違いで、コンパイル時のチェック有無の違いだけで実行内容は同じです。

投稿2023/07/03 02:22

otn

総合スコア85607

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

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

dokunira

2023/07/03 02:27

`void (*vectors[]) = {` としてもエラーは出ませんでした。h8300-elf-gccというコンパイラです。
otn

2023/07/03 02:53

そうなんですね。型チェックが甘いということか。 組み込み用コンパイラはあまり知りませんが、 1000(); でアドレス1000番地の関数を呼べそうな気もするので、 関数ポインタと数値の区別をしてないのかも知れませんね。
fana

2023/07/03 03:01

おっと,私の回答もナチュラルに > void (*vectors[])() = {と書いた ものと想定していました.(と,一応述べておく)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問