###実現したいこと
参考質問:【C++】なぜヘッダと実装はわけるべきなのでしょうか(.hに実装を書くことは邪道か)
個人でよく使う関数などをまとめたいというのが動機でヘッダファイル1つだけにまとめる実装は出来ました。
しかしヘッダファイルは宣言だけにしてヘッダファイルには定義しないのが一般的ということを知って実際に試してみようと思ったのが発端です。
よくない方法だと知ったのでヘッダファイルとソースファイルに分けて実装する方法も知っておきたいと思いました。
※独学で不慣れなので用語や考え方に間違いがあればご指摘ください。
MAIN.cpp メインのソースファイル
b.hpp 関数が宣言されたヘッダファイル
b.cpp 関数が定義されたソースファイル
MAIN.cppからb.hppをインクルードしてb.cppの関数を使いたい。
具体的にはfunc1("test");
が実行され、出力でtest
と表示されるようにしたい。(入力なし)
###質問
下記リンク先のpaiazaのオンライン実行環境で複数ファイルを作成しています。
ヘッダファイルのみの場合は想定通りの挙動をするのですが、
ソースファイルとヘッダファイルに分けるとエラーとなり原因が分からないのでご教示ください。
よろしくお願いします。
###試したこと
普段使っているVSCodeの環境でブログを参考にヘッダファイルとソースファイルを分けようとしていましたがpaizaでのエラーと同様なエラーとなってうまくいきません。
コンパイル環境などに原因があるか切り分けたいのでpaizaの実行環境で試してもエラーとなりました。
error: redefinition of
のエラー内容で検索すると2重定義のエラーというキーワードが出てくるのですが、どいうことかよく分かりませんでした。
もしかするとヘッダファイルとソースファイルで2回func()が書かれているからかとも思いましたが、ヘッダファイルとソースファイルがそういうセット同士のような関係なので宣言と定義で2回書かなてなければならないはずだと思います。
いくつか検索したブログなどの中でリンク先のものが自分には分かりやすかったのですが同じようにしてるつもりがうまくいかないのでアドバイスなどあればご教示ください。
error
1b.cpp:2:6: error: redefinition of 'func1' 2void func1(std::string s) { std::cout << s << std::endl; } 3 ^ 4./b.hpp:4:6: note: previous definition is here 5void func1(std::string s) {} 6 ^ 71 error generated.
###MAIN.cpp
C++
1#include "b.hpp" 2int main() { 3 func1("test"); 4}
###b.hpp
C++
1#pragma once 2#include <iostream> 3#include <string> 4void func1(std::string s) {}
###b.cpp
C++
1#include "b.hpp" 2void func1(std::string s) { std::cout << s << std::endl; }
回答1件
あなたの回答
tips
プレビュー