- ベストアンサー
関数のプロトタイプ宣言の文法は次のようになります。
関数のプロトタイプ宣言の文法は、次のようになります。 型 関数名(引数); 関数定義から処理部分を取り除き、ひとつのステートメントとして完結するように、文末に; を付けてたものになります。 基本的に関数を呼び出すための形式を宣言するためのものですから、型、関数名、引数は 関数定義と同じになります。プロトタイプ宣言は、対象となる関数を呼び出す前に行う必要があります。 以上は参考書の説明ですが!「関数定義から”処理部分”を取り除き」とあります。 その中の”処理部分”とは何を指すのでしょうか!? 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- プロトタイプ宣言について
C言語で関数を作成しプロトタイプ宣言するときの質問です。 関数実体の引数に構造体のポインタを宣言します。 プロトタイプ宣言には,構造体のポインタを宣言したのと同じ位置にvoid *を宣言します。 関数実体とプロトタイプ宣言は,異なるファイルです。 このように作成した関数は,VC++2008では,コンパイルできるのですが, なぜ関数実体の宣言とプロトタイプ宣言の型が異なるのにコンパイルできるのでしょうか? また,この関数を別ファイルの関数から呼び出した場合,正しく引数を理解し,正しく処理されます。 これは,言語仕様として正しい書き方なのでしょうか? それとも環境依存の書き方なのでしょうか? ご存知の方がいましたらお答えお待ちしています。
- ベストアンサー
- C・C++・C#
- 関数のプロトタイプ宣言
#include <stdio.h> #define N 3 #define M 4 int sum(int [][M]); (関数のプロトタイプ宣言) int main(){ ・ ・ ・ return(0); } int sum(int x[][M]){ ・ ・ } 以上のプログラムより、関数のプロトタイプ宣言や、関数内の 行列の定義でint sum(int [][M]);や int sum(x[][M]){}となっていますが なぜ、列にMだけを代入することだけでよいのでしょうか? また、教科書に関数のプロトタイプ宣言ではint sum(int [][]);だけでもよいと書かれていたのですが 実際、コンパイルしてみたところ 'int[]' 型のサイズは未知あるいはゼロとエラーがでました。 これは、コンパイラによってできるものとできないものがあるのでしょうか?? よろしくお願いします。
- 締切済み
- C・C++・C#
- C言語 関数プロトタイプ宣言の引数に配列を入れたいのですが
関数プロトタイプ宣言(自作関数)の引数に、A[4][4]というような配列を入れたいのですが、コンパイル時にエラーでincompatibleといわれてしまいます。 A[0][0]からA[3][3]までを個別に引数に指定してもエラーになります。 良い方法は無いでしょうか?
- ベストアンサー
- C・C++・C#
- 関数の仮引数は宣言か式か
”関数の仮引数の宣言”は”変数の宣言・定義”と同じように”宣言”と明確に考えるべきなのか”関数の仮引数”を”式”と考えて良いのかという問題です。 私が迷ってしまったのは"配列を仮引数"にとった例です。 規則として ”int a[ ] が int *a と同じ意味になるのは、唯一、関数の仮引数の宣言のばあいだけである”という規則がありますが、これは”関数の仮引数の宣言”は変数の宣言・定義”と同じように”宣言”と明確に考えている例だとおもいます。 int a[ ] が int *a と型名 変数名(引数名)と宣言の形をとっているので当然だと思いますが、一方 配列は、式の中で「先頭へのポインタ」によみかえられる。 ↓ 関数の引数は式なので、配列は「先頭へのポインタ」に読み変えられる←引数部分を”宣言”ではなく”式”と捉えてる←ここが私の迷っているところ ↓ よって、関数に渡ってくるのは、結局はつねにポインタだ。 という説明もあります。 私の今までの理解ではc言語では”宣言の部分”と”式”の部分は明確に区別されるものと考えていました。”宣言部分の初期化の="と”代入の=”とは明確に区別されていました。 それと同じように”関数の仮引数の宣言”は”宣言部分”と捕らえるのか”式”ととらえるのか ”宣言”と”式”が私の頭の中混乱しています。 宜しくお願いします。
- ベストアンサー
- C・C++・C#
- トリッキーなJSの文法(prototype.jsなど)が分かりません
Ajaxの「prototype」( http://www.prototypejs.org/ )などで 下記のようなfunctionの記述方法をよく見かけます。 ▼Prototype.js(ver1.5.0) 20行目抜粋 ---------------------------------------- var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } -------------------------------------------- でも、私には高度すぎて以下の点がどうしても読み解けません。 (1)var Class = {~~~~~~} が、何をしているのか分かりません。 配列なら[ ]ですし関数か何かを省略した宣言の記述方法なのでしょうか? (2)create: が何なのか分かりません。必死で調べたら型を宣言しているような感じでしたが、 見慣れない「:」を使ったプログラムで検討もつきません。 私が知っているfunction宣言はこの2パターンのみしか知りません。 ・一般的なfunction宣言 function test(hikisu){ //処理内容 } ・無名関数でのfunction宣言 var a = function(x) { //処理内容 } ぜひ教えていただけませんでしょうか。 どうぞよろしくお願いします。
- ベストアンサー
- JavaScript
- 関数原型宣言について
関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************
- ベストアンサー
- C・C++・C#
- gcc -c -Wconversionでwarningが消えません
gcc version 2.96 20000731 (Red Hat Linux 7.0) でコンパイルオプション -c -Wconversionでwarningが消えません。 warning: passing arg 1 of `関数名' with different width due to prototype とwarningが出るのですが、プロトタイプ宣言の引数の型にちゃんとキャストして渡しているのですが…ちなみにプロトタイプ宣言の引数自体がint型とポインタだとwarningは出ません。-Wconversionとはいったい何者なのでしょうか? すべての関数の引数の型をint型とポインタに変更すればwarningは消せるのですが、なんか違う気がします。 かなり漠然的な質問で申し訳ありませんがどなたか知っていれば教えてください。宜しくお願い致します。
- 締切済み
- C・C++・C#
- 型宣言に現れる * [] () の構文要素名は?
型宣言の中に現れる "*","[]","()" (関数型を表す丸括弧) などは, 文法上は何という名前なのでしょうか? 例えば次の型宣言 (定義) char **p; int q[8]; において,手元の「ANSI C/C++ 辞典」によると, char や int は型指定子 (type specifier), **p はポインタ宣言子 (pointer declarator), q[8] は配列宣言子 (array declarator) になると思いますが, "*","[]" 単独の構文要素名は見あたりません. 個人的には * [] () のことを「型派生子」とか,曖昧に「(型派生)演算子」と呼んでいますが, 前者は上記の本にも載っていないし,検索しても全くヒットしません. 単に「演算子」だと他人に説明するとき誤解を招きそうだし….
- ベストアンサー
- C・C++・C#
- ライブラリ関数の説明
プログラミングの言葉で説明しろといわれてなかなか出来なかったので質問させていただきます。 include <stdio.h> はstdio.hを開いて、その内容はmain関数やprintf関数のプロトタイプ宣言がされている。 printf(”%d”,a) は引数に”%d”とaを渡してどのような処理がされているのでしょうか。 scanf(”%d”,&a) は引数に”%d”と変数のアドレスを渡している。 この引数に”%d”を書くことは何を渡しているのでしょうか。 また、printf(”abcdef”)と書いた場合printf関数にはabcdefの先頭アドレスが渡されていると考えていいのでしょうか。
- 締切済み
- C・C++・C#
補足
レスありがとうございます。 基本的なことがまだ身についていませんので! 再度!参考書を読みます。 解決まではしばらくお待ちくださいませ^^