C++でヘッダに関数を書く方法を探す
簡単なコードなら、直接にヘッダに書くのは便利だと思います。コードは多くないからコンパイルする時に時間はあまり掛からない。別にコードは多くないので分けたCPPに関数を書くのもちょっと面倒くさい
でも複数コードファイルの場合、リンクする時LNK2005になりました。初心者に対して本当に悩んでるエラーですね(笑)。私は始めてC++言語を勉強する時もよくあってました。
実は方法があると思う。
- 1、普通な関数
インライン化すれば、このエラーがでません。例えばex.hにこんな関数があります
#pragma once
int func() {
return 1;
}
そして、a.cppとb.cpp
a.cpp
#include "ex.h"
b.cpp
#include "ex.h"
#includeint main() {
std::cout << func() << std::endl;
return 0;
}
コンパイルする:cl a.cpp b.cpp
LNK2005になりました。
もし、関数にinlineを付いたと
ex.h:
#pragma once
inline int func() {
return 1;
}
今度には exe 出た。
- 2、global変数がある場合
global変数を使う場合はどうすればいいのでしょう。MSDNで探すとわかりました。__declspec(selectany) と言うものがあります
例えばex.hがこうになる:
#pragma once
int g = 10;
inline int func() {
return g;
}
またLNK2005出たw
__declspec(selectany)を付いたと
#pragma once
__declspec(selectany) int g = 10;
inline int func() {
return g;
}
できるようになったよね
__declspec(selectany)は、MinGW GCCでも使えます。VCと違って、__declspec(selectany) int g; と書くとGCCでコンパイルできません。 = 数字 は必要です。(MinGWしか試したことがありません)
- クラスの場合
ex.h
#pragma onceclass A {
public:
int func() { return 10; }
};
a.cppはこのまま、編集していません
b.cpp
#include "ex.h"
#includeint main() {
A a;
std::cout << a.func() << std::endl;
return 0;
}
おぉ、G++もVCもエラーが出ません。
実は前に、クラスの関数は直接にクラスの中に書くとインラインになったと聞いた。本当のことですね
static変数の場合、global変数と同じで __declspec(selectany) を使う。例えば
ex.h
#pragma once
class A {
public:
int func() { return sv; }
static int sv;
};__declspec(selectany) int A::sv = 10;
なお、再帰関数にもinlineを使えます(リンクする時LNK2005を回避の意味だけです)。
何か相談したいことがあればご遠慮なくツイッターでsorayukinoyumeへどうぞ。
雷鳴