同一のプロジェクトで、異なるソースコードから関数を呼び出す (その2)(extern を header に)

宣言を別途一つのファイルにまとめ、呼び出し側から取り込む方法について見ていきます。

準備

現状のやり方だと、使いたい関数が増えれば増える分だけ宣言の記述量が増えてしまいます。 実際に見てみましょう。 MySource.cpp に関数を追加します
int mySourceFunc()
{
	return 444;
}

int mySourceFunc1(int num)
{
	return 555 + num;
}

int mySourceFunc2(int op, int num1)
{
	switch (op) {
	case 1:
		return 666 - num1;
	default:
		return 666 + num1;
	}
}
MySource.cpp から使いたい関数が3つになりました。 現状のやり方だと次のように宣言を関数分追加することになります。
#include <stdio.h>

int myFunc();
int mySourceFunc();
int mySourceFunc1(int);
int mySourceFunc2(int, int);

int main()
{
    printf("Hello World!\n");
    printf("myFunc: %d\n", myFunc());
    printf("mySourceFunc: %d\n", mySourceFunc());
    printf("mySourceFunc1: %d\n", mySourceFunc1(20));
    printf("mySourceFunc2: %d\n", mySourceFunc2(1,30));
}

int myFunc()
{
    return 123;
}
関数の数が 10個, 100個 と増えればその分行数も必要になってきます。(今回はまだ3個のみですが) また、関数の宣言は定義側と型 (返り値、各引数) を正確に合わせなければなりません。 そこで、C言語では という方法があります。

手順 - ヘッダーファイルの作成

[ソリューション エクスプローラー] の [ヘッダー ファイル] を右クリックする [追加] > [新しい項目] を押下する [Visual C++] > [ヘッダー ファイル (.h)] を押下する [名前] に "MySource.h" と入力し、[追加] を押下する [ヘッダー ファイル] 項目配下に "MySource.h" が追加されたことを確認する "MySource.h" が開かれた状態になったことを確認する ここで一旦、"ConsoleApplication1.cpp" を開きなおす 下記行を切り取り (Ctrl + X) する
#include <stdio.h>

int myFunc();
int mySourceFunc();
int mySourceFunc1(int);
int mySourceFunc2(int, int);

int main()
{
    printf("Hello World!\n");
    printf("myFunc: %d\n", myFunc());
    printf("mySourceFunc: %d\n", mySourceFunc());
    printf("mySourceFunc1: %d\n", mySourceFunc1(20));
    printf("mySourceFunc2: %d\n", mySourceFunc2(1,30));
}

int myFunc()
{
    return 123;
}
改めて "MySource.h" を開く 下記へ貼り付け (Ctrl + V) する
#pragma once
int mySourceFunc();
int mySourceFunc1(int);
int mySourceFunc2(int, int);
宣言をまとめたファイルはこれで完成です。 最後に呼び出し側からこのファイルの取り込みを行います。

手順 - ヘッダーファイルの使用

"ConsoleApplication1.cpp" を開く 次の行を追加する
#include <stdio.h>
#include "MySource.h"

int myFunc();

int main()
{
    printf("Hello World!\n");
    printf("myFunc: %d\n", myFunc());
    printf("mySourceFunc: %d\n", mySourceFunc());
    printf("mySourceFunc1: %d\n", mySourceFunc1(20));
    printf("mySourceFunc2: %d\n", mySourceFunc2(1,30));
}

int myFunc()
{
    return 123;
}
これで対応は完了しました。 画面上部 [ローカル Windows デバッガー] を押下します。 期待通り動作しています。

説明

先ほど #include "MySource.h" という行を追加しました。 実際の動作としましては、下記と同じことなのです。
#include <stdio.h>
// #include "MySource.h" は下記を書くことと同じ
int mySourceFunc();
int mySourceFunc1(int);
int mySourceFunc2(int, int);

int myFunc();

int main()
{
    printf("Hello World!\n");
    printf("myFunc: %d\n", myFunc());
    printf("mySourceFunc: %d\n", mySourceFunc());
    printf("mySourceFunc1: %d\n", mySourceFunc1(20));
    printf("mySourceFunc2: %d\n", mySourceFunc2(1,30));
}

int myFunc()
{
    return 123;
}
#include の基本動作としては、指定されたテキストファイルの内容を単に展開するだけなのです。 (先頭が # から始まる行に対しては特別な処理が行われますが) 次のページでこの #include について詳しく見ていきましょう