10

だから私のプログラムはうまく機能しています。コンパイル、リンク、実行、作業。次に、次のような単純な関数をファイルの1つに追加することにしました。

#ifndef UTILITY_HPP
#define UTILITY_HPP

/* #includes here.  There's no circular include, I've checked. */

namespace yarl
{
    namespace utility
    {
        (several function declarations and definitions)

        bool isVowel(const char c)
        {
            if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
                return true;
            else return false;
        }
    }
}

#endif

その関数定義は、コードに加えた唯一の変更です。他のすべてはそれがあったのとまったく同じです。まだ何も呼ばれていません。コンパイルしましたが、リンクに失敗しました。g++は、これを含むすべてのファイルに対して次のエラーの1つを返します。

./obj/Feature.o: In function `yarl::utility::isVowel(char)':
/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src/Utility.hpp:130: multiple     definition of `yarl::utility::isVowel(char)'
./obj/Events.o:/home/max/Desktop/Development/Yarl Backup/yarl v0.27/src    /Utility.hpp:130: first defined here
./obj/GameData.o: In function `yarl::utility::isVowel(char)':

コメントアウトするisVowelと、再び機能します。名前を変更しようとしましたが、まだ機能しません。に置き換えてみましたがvoid randomFunctionName() {}、まだ動作しません。非インラインにして、関数本体をUtility.cppに入れてみましたが、まだ機能しません。私は非常に混乱しています。単純な関数を1つ追加すると、リンカーが台無しになるのはなぜですか?

4

1 に答える 1

22

関数をインラインで宣言するか、別の.cppファイルで定義します。それ以外の場合、ヘッダーを含めるすべてのC ++ファイルは、関数の独自の公開されている定義を作成しようとします。

編集:そしてfwiw、条件付きをテストしている場合、明示的にtrueまたはfalseを返す必要はありません。条件自体を返すだけです。

inline bool isVowel(const char c)
{
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}
于 2010-06-28T22:32:10.443 に答える