関数は基本的に C と同じである.
basic_func.d
1 2 3 4 5 6 7 8 9 | import std.stdio;
void main(){
writefln( "square(9) = %d", square(9) );
}
int square(int i){
return i * i;
}
|
basic_func.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./basic_func
square(9) = 81
基本的な構文は C と同じ.
D にプロトタイプ宣言はない, C++ のクラスのメンバ関数と同じように, 関数定義はモジュール内に自由な順番で書ける.
in_out_ref.d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import std.stdio;
void main(){
int x = 99;
write("in ", x, " ");
f(x);
writeln(x);
x = 99;
write("out ", x, " ");
g(x);
writeln(x);
x = 99;
write("ref ", x, " ");
h(x);
writeln(x);
}
/*
関数宣言の引数で in, out, ret 修飾が使える
*/
void f(in int x){
/*
in: 値渡しであり, 変数は const scope になるため書き換えられない.
*/
write("{", x, " ");
// x = 100; write("assign"); // 書き換え不可
write(x, "} ");
}
void g(out int x){
/*
out: 参照渡しであり, 関数に書き込んでもらうバッファ先に使うのが一般的.
関数呼び出しと同時に変数がその型の初期値で初期化される.
*/
write("{", x, " ");
x = 100; write("assign ");
write(x, "} ");
}
void h(ref int x){
/*
ref: 参照渡しであり, ローカル (呼び出し先) で書き換えると呼び出し元も書き換わる.
out と違い初期化されない.
*/
write("{", x, " ");
x = 100; write("assign ");
write(x, "} ");
}
|
in_out_ref.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./in_out_ref
in 99 {99 99} 99
out 99 {0 assign 100} 100
ref 99 {99 assign 100} 100
p_to_func.d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import std.stdio;
void printMona(){
writeln("mona");
}
void main(){
void (*cFuncPointer)() = &printMona;
cFuncPointer();
/*
C 形式の宣言方法を使用できる.
*/
void function() dFuncPointer = &printMona;
dFuncPointer();
/*
D 形式の関数ポインタは宣言方法がわかりやすい.
*/
}
|
p_to_func.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./p_to_func
mona
mona