関数

関数は基本的に 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 引数

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

Table Of Contents

Previous topic

文字列

Next topic

構造体と共用体