c – 将函数添加到先前链接文件后的多个定义链接器错误

所以我的程序运行正常.编译,链接,运行,工作.然后,我决定在我的一个文件添加一个简单的函数,如下所示:
#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为每个#includes这个文件文件给出了其中一个错误

./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中,仍然无法正常工作.我非常困惑.为什么添加一个简单的函数会搞砸链接器?

解决方法

声明函数内联,或在单独的.cpp文件中定义它.否则,您在其中包含标头的每个C文件都会尝试创建自己的,公开可用的函数定义.

编辑:和fwiw,如果您正在测试条件,则不需要显式返回true或false.只需返回条件本身:

inline bool isVowel(const char c)
{
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...