アカウント名:
パスワード:
こんなコード書くほうが問題だろ
ネスト可能な関数は、Pascal サポートの副産物だそうですよ。
# Pascal 書くほうが問題だとかいうとフレームの元なので注意しよう
この例ではあまりに簡単すぎて有用性が分かりにくいのですが
という場合には便利です(私は多分互換性重視で使いませんが).
問題は, 伝統的なC言語にはファイルを分割する以外にクラスやモジュール(Modulaなんか)の様に明示的に名前空間を制御する機能が欠けていることだと思います.
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家
Linux版は (スコア:1)
しかし、「幅広gcc拡張子サポート」って……
原文は"wider gcc extention support"とかなんとかだと思いますが。
Re:Linux版は (スコア:0)
「より広範なGCCの拡張をサポート」
ってことですか?
#内容はよくわかんないのでAC
gccの拡張 (スコア:2, 参考になる)
こんなネストした関数も動きます。
intel のコンパイラではサポートしてなさそうですが(^^;
#include <stdio.h>
typedef int int2int(int);
int g(int b, int2int* padd) {
return (*padd)(b);
}
int f(int a, int b) {
int add(int n) {
return n+a;
}
return g(b, add);
}
int main(void) {
printf("%d\n", f(1,2));
return 0;
}
Re:gccの拡張 (スコア:2, すばらしい洞察)
Re:gccの拡張 (スコア:2, 参考になる)
いえいえ、ネストした関数を書くのはpascal(Oberon,Algol,Ada,等)では基本です。
いったん慣れると、コレ無しではいられません。
とゆーか、最初Cを見たとき
「ネスティング出来ないでまっとうにプログラム書けるのぉ?」
と思ったっす。
-----------------
#そんなワタシはOS/2ユーザー:-)
Re:gccの拡張 (スコア:1)
ネスト可能な関数は、Pascal サポートの副産物だそうですよ。
# Pascal 書くほうが問題だとかいうとフレームの元なので注意しよう
Re:gccの拡張 (スコア:1)
この例ではあまりに簡単すぎて有用性が分かりにくいのですが
という場合には便利です(私は多分互換性重視で使いませんが).
問題は, 伝統的なC言語にはファイルを分割する以外にクラスやモジュール(Modulaなんか)の様に明示的に名前空間を制御する機能が欠けていることだと思います.
Re:gccの拡張 (スコア:1)
この例の肝は、ネストされた関数addが親スコープの変数aの値を
参照しているということだったりします。
closure もどきなんですよね。(外には返せないので別物ですが)
実際に吐かれるコードを見ると、動的にラッパ関数を生成して
親スコープのスタックフレームへのポインタを関数に渡しています。
Re:gccの拡張 (スコア:0)
Javaのインナークラスや無名クラスの使い方と よくにている気がする。