
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
ちょっと考えてみましょう。
void function0(int a){};
void function1(int a = 10){};
void function2(int a = 20){};
typedef void (*test)(int);
test f ;
としたときに
f = &function0;
f = &function1;
f = &function2;
いずれも正しいですね。では
f();
としたら、何を引数に渡したらよいでしょう?
void function(int a = 10)
は、あくまで
void function(int a)
であって、
function()
としたときに、プロトタイプから判断して
funtion(10)
としてコンパイルしてくれるだけです。
No.4
- 回答日時:
因みに、Visual C++ (Intel x86)の場合、呼出元が積んだスタック上の引数を開放するのは呼出先の責任(デフォルトはstdcall呼び出し規約)なので、呼ばれた先の関数は「引数が1つ積まれている筈だ」として、積まれていない引数を開放しようとして、スタックの操作を行う筈。
すると、引数がある筈の関数を引数を渡さずに呼んだ場合、呼び出し元に帰って来た時点でスタックがズレて、最悪、暴走します。
なので、functionの定義、test型のタイプ宣言で、呼び出し規約も含めて宣言し、そこだけ「呼出元が積んだスタック上の引数を開放するのは呼出元が行い、呼んだ先では操作しないように」と宣言する必要があります(つまり、functionの定義とtestのプロトタイプにcdecl呼び出し規約が必要)
呼び出し規約を理解しないままやると暴走するから「呼び出し規約って何?」ってレベルの場合は「キャストで無理矢理呼び出す」などという下手な考えはしない事。
No.3
- 回答日時:
因みに
void function(int a = 10){};
typedef void (*test)(void); //testは引数なしで型宣言
test a = (test)(&function); //引数有りを引数無しに無理矢理にキャスト
a(); //引数無しで呼び出す
なら可能。
あと、C言語って、かなり柔軟性が高いから
test a = (test)0x0445E000; //aに0x0445E000をセット
a(); //0445e000番地を無理矢理に呼び出す
とかって事も可能(0445e000番地のメモリにプログラムが無かったら何が起きるか判らない)
No.2
- 回答日時:
>a(); //このように呼び出したい
呼べない。呼ぶとエラーになる。
今のC++やC#の関数定義って「引数の個数や型も含めて定義される」から
void function(int a)
と
void function(void)
は「異なる定義になり、二重定義にはならない」のです。
事実、ある処理系では
void function(int a)
は、外部参照ラベルが
__void_function_int
としてリンケージエディタに渡され
void function(void)
は、外部参照ラベルが
__void_function_void
としてリンケージエディタに渡され、それぞれが異なる関数として実装されます。
なので
a();
と書くと「そんな関数は知らん」って言われるか「引数の個数が違う」って言われる事になるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マルチメディアタイマー
-
const_castのつかいどころを教...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
既定のコンストラクタがありま...
-
TimerProc コールバック関数を...
-
int main()、void main()、void...
-
定義した文字列を wchar_t 系の...
-
qsortの引数について
-
組み込みマイコン
-
マルチメディアタイマーの使用方法
-
スレッドの作成について(pthre...
-
DirectInput でのエラー
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
c言語 引数のvoidについて
-
C++にてtemplateで受け取った任...
-
C#でテンキーの操作は可能でし...
-
多重定義が起きている?--lnk20...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報