この質問はそれほど具体的ではありません。それは本当に私自身の C エンリッチメントのためであり、他の人にも役立つことを願っています。
免責事項: 多くの人が「FP を実行しようとしている場合は、関数型言語を使用してください」という衝動に駆られることを私は知っています。私は、他の多くの C ライブラリにリンクする必要がある組み込み環境で作業しており、さらに多くの大規模な共有ライブラリ用のスペースがなく、多くの言語ランタイムをサポートしていません。さらに、動的メモリ割り当ては問題外です。私もとても興味があります。
私たちの多くは、ラムダ式用のこの気の利いた C マクロを見たことがあるでしょう。
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
使用例は次のとおりです。
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
を使用するgcc -std=c89 -E test.c
と、ラムダは次のように展開されます。
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
だから、これらは私の質問です:
行int (*X);は正確には何をしますか。宣言する?もちろん、int * X; は整数へのポインタですが、これら 2 つの違いは何ですか?
展開されたマクロを見ると、ファイナルは一体何をしているの
__fn__
だろうか?テスト関数を作成するvoid test() { printf("hello"); } test;
と、すぐにエラーがスローされます。その構文がわかりません。これはデバッグにとって何を意味するのでしょうか? (私はこれと gdb で自分自身を実験する予定ですが、他の人の経験や意見は素晴らしいでしょう)。これは静的アナライザーを台無しにしますか?