多个cpp文件中的一个头文件:多重定义

One header file in multipe cpp files: Multiple definition

我正在尝试访问多个 C++ 文件中的一个头文件。头文件定义如下:

#ifndef UTILS
#define UTILS

void toUpper(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = toupper(str.at(i));
    }
}

void toLower(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = tolower(str.at(i));
    }
}


#endif // UTILS

编译代码时出现以下错误:

据我所知,这不应该 return 多个定义,因为我限制代码被定义多次。我还尝试使用预编译指令“#pragma once”

这个问题有 2 个解决方案。

解决方案 1

您可以在函数前面添加关键字 inline,例如:

myfile.h

#ifndef UTILS
#define UTILS

inline void toUpper(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = toupper(str.at(i));
    }
}

inline void toLower(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = tolower(str.at(i));
    }
}


#endif // UTILS

现在您可以将此 header 包含在不同的文件中而不会出现上述错误。

解决方案 2

您可以创建一个单独的 .cpp 文件并将定义放在那里。这看起来像:

myfile.h

#ifndef UTILS
#define UTILS

//just declarations here
void toUpper(string &str);    //note no inline keyword needed here

void toLower(string &str);    //note no inline keyword needed here

#endif // UTILS

myfile.cpp

#include "myheader.h"
void toUpper(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = toupper(str.at(i));
    }
}

void toLower(string &str) {
    for(unsigned int i=0; i<str.length(); i++) {
            str.at(i) = tolower(str.at(i));
    }
}