ヘッダファイルに関数の定義を書くと、
そのヘッダファイルを2か所以上でincludeするとエラーになります
これを避けるためにはどうすればよいですか
inlineを付ければそれでよいですか
例)
header.h、source1.cpp、source2.cppを作ります
中身は以下です
header.h
#pragma once
void func() {} // ※1
// inline void func() {} // ※2
source1.cpp
#include "header.h"
source2.cpp
#include "header.h"
int main(int argc, char** argv) { return 0; }
これのビルドを試みるとエラーになります
※1の代わりに※2を使用するとエラーになりません
No.4
- 回答日時:
メンバー関数だと static は違う意味になっちゃうね. メンバー関数をインライン展開させたかったら
・クラス定義の中で関数を定義する
・クラス定義の外で inline を付けて関数を定義する
のどちらか.
なお, 非常に残念なことに, 「inline 展開できない」場合であってもエラーにはならないのですよ>#3. 関数として展開されないことが「多い」のでわかりづらいかもしれませんが.
回答ありがとうございます
最初は「・クラス定義の中で関数を定義する」を試みたのですが
これができなくクラス定義の外で定義が必要で
「・クラス定義の外で inline を付けて関数を定義する」のをしようと思います
No.3
- 回答日時:
No.1です
> 宣言をヘッダファイルに書きたいのではなく
> 定義をヘッダファイルに書きたいのです
やりたいことは理解しました。
そうすると、同じ関数がincludeで展開された数生成されてしまうので、リンクエラーになりますね。
// inline void func() {} // ※2
↑この場合、関数として展開されないことが「多い」のでエラーになりづらいですが、
inlibe展開出来ない場合にはやはりエラーとなってしまいます。
同じ関数名でもエラーにしたくないのであれば、
static void func() {}
で宣言してください。これで、各モジュールに同じ関数が展開され、かつリンクエラーにはなりません。
No.2ベストアンサー
- 回答日時:
「エラーになります」というならエラーメッセージも書くべきだ.
inline とか static とか, とにかく「同一コンパイル単位でのみ可視」なようにすればいい. そのかわり, 最終的なコードで同じ関数が重複する (可能性がある) ことはあきらめてほしい.
ちなみに
void func() ;
は「定義ではない宣言」だよ>#1.
回答ありがとうございます
エラーについては今手元に環境が無いため後で調べてみます
内容は既に定義されています、というようなリンクエラーでした
他にもメンバ関数を定義したく
これはstaticは多分使えなかったと思うのでinlineを使ってみます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
HEWを使用しているのですが、こ...
-
VB2008で定数に色の設定をした...
-
ビルド失敗 指定されたファイ...
-
VC++ 2010 Expressのエラー
-
ビルドが失敗してしまいます
-
バッチからsqlplusの接続エラー...
-
sys/time.hのインクルードがで...
-
適切な変換関数が存在しない???
-
TeXのエラーメッセージ
-
Handlesについて
-
fortranでプログラムを実行する...
-
「Visual C++ 2008 Express」の...
-
RightとLeft関数のライブ...
-
Visual Studioのstrcpy_sについて
-
WindowsからLinuxへの移植
-
FileUploadを利用しての画像保...
-
Excel VBAにて特定のサイトから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
fortranでプログラムを実行する...
-
バッチからsqlplusの接続エラー...
-
適切な変換関数が存在しない???
-
VB2008で定数に色の設定をした...
-
HEWを使用しているのですが、こ...
-
sys/time.hのインクルードがで...
-
BC30002: 型 'ListItem' が定義...
-
Handlesについて
-
Visual Studioのstrcpy_sについて
-
RightとLeft関数のライブ...
-
error C3867 関数呼び出しには...
-
デバッグ中のエラーのことで教...
-
コンパイルできません。
-
multiple definitionというエラー
-
ビルド失敗 指定されたファイ...
-
レコードセットをcloseする所で...
-
左側がクラス、構造体、共用体...
おすすめ情報
エラーメッセージは以下です
/xxxx/bin/ld: error: libmunyamunya.a (Munyamunya.o): multiple definition of 'IC::~IC()'
/xxxx/bin/ld: error: Premunyamunya.o: previous definition here
※↑がたくさんでる
clang++: error: linker command failed with exit code 1 (use -v to see invocation)