電子書籍の厳選無料作品が豊富!

ヘッダファイルに関数の定義を書くと、
そのヘッダファイルを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を使用するとエラーになりません

質問者からの補足コメント

  • エラーメッセージは以下です
    /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)

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/08/19 00:11

A 回答 (4件)

メンバー関数だと static は違う意味になっちゃうね. メンバー関数をインライン展開させたかったら


・クラス定義の中で関数を定義する
・クラス定義の外で inline を付けて関数を定義する
のどちらか.

なお, 非常に残念なことに, 「inline 展開できない」場合であってもエラーにはならないのですよ>#3. 関数として展開されないことが「多い」のでわかりづらいかもしれませんが.
    • good
    • 0
この回答へのお礼

回答ありがとうございます
最初は「・クラス定義の中で関数を定義する」を試みたのですが
これができなくクラス定義の外で定義が必要で
「・クラス定義の外で inline を付けて関数を定義する」のをしようと思います

お礼日時:2019/08/19 00:13

No.1です



> 宣言をヘッダファイルに書きたいのではなく
> 定義をヘッダファイルに書きたいのです

やりたいことは理解しました。
そうすると、同じ関数がincludeで展開された数生成されてしまうので、リンクエラーになりますね。

// inline void func() {} // ※2
↑この場合、関数として展開されないことが「多い」のでエラーになりづらいですが、
inlibe展開出来ない場合にはやはりエラーとなってしまいます。

同じ関数名でもエラーにしたくないのであれば、

static void func() {}
で宣言してください。これで、各モジュールに同じ関数が展開され、かつリンクエラーにはなりません。
    • good
    • 0
この回答へのお礼

返信ありがとうございます

お礼日時:2019/08/19 00:12

「エラーになります」というならエラーメッセージも書くべきだ.



inline とか static とか, とにかく「同一コンパイル単位でのみ可視」なようにすればいい. そのかわり, 最終的なコードで同じ関数が重複する (可能性がある) ことはあきらめてほしい.

ちなみに
void func() ;
は「定義ではない宣言」だよ>#1.
この回答への補足あり
    • good
    • 0
この回答へのお礼

回答ありがとうございます

エラーについては今手元に環境が無いため後で調べてみます
内容は既に定義されています、というようなリンクエラーでした

他にもメンバ関数を定義したく
これはstaticは多分使えなかったと思うのでinlineを使ってみます

お礼日時:2019/08/16 00:13

> ヘッダファイルに関数の定義を書くと、



定義ではなく処理を記載していますよね。
void func() ;
と、定義だけにしましょう。
    • good
    • 0
この回答へのお礼

返信ありがとうございます

ええとですね
宣言をヘッダファイルに書きたいのではなく
定義をヘッダファイルに書きたいのです

No.2の回答でも触れられていますが
void func();は定義(definition)でなく宣言(declaration)です

お礼日時:2019/08/16 00:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!