gpt4 book ai didi

c++ - .cpp 文件中函数的多个定义

转载 作者:行者123 更新时间:2023-11-28 07:53:27 28 4
gpt4 key购买 nike

编辑:

唉,我觉得自己像个白痴。直到我问他的问题几个月后,我才向我正确解释了 C++ 文件包含。请不要评论我的设置到底有多么有缺陷,我非常清楚。

我有一个包含许多 .h 和 .cpp 文件的多文件项目。特别是 io_util.h,会产生一系列奇怪的错误。对于包含函数声明但没有实现的 .h,可以完美编译,但在函数体所在的 .cpp 中,每个函数都会产生以下错误:

   Multiple markers at this line
- first defined here
- multiple definition of
`<namespace>::<function name>(<args>)'

文件“io_util.cpp”仅包含在项目 CollectionBase.h 中一次。 “io_util.h”仅包含在“io_util.cpp”中

这是两个文件:

.h:

/*
* io_util.h
*/

#ifndef IO_UTIL_H_
#define IO_UTIL_H_

#include <iostream>
#include <sstream>
#include <string>
#include <cmath>

#define IO_DEBUG(a) cout << #a << '=' << a << '\n'

#define CASE_SEP 32
#define NUM_CHAR_SEP 48

namespace std
{
void getVar(int&, int);

void getVar(double&, double);

void getVar(unsigned&, unsigned);

int get_num_digits(int);

int get_digit(int, const int, const int);

string value_of(int);
}

#endif /* IO_UTIL_H_ */

.cpp:

/*
* io_util.cpp
*/
#ifndef IO_H_
#define IO_H_

#include "io_util.h"

namespace std
{

void getVar(int& i, int forbidden = NAN)
{
string str;

while(true)
{
getline(cin,str);

if(str.find_first_not_of("-0123456789") != string::npos || !(stringstream(str) >> i))
{
cout << "invalid input.\n\n";
}
else if(i == forbidden)
{
cout << "illegal value.\n\n";
}
else
{
break;
}
}
}

void getVar(double& d, double forbidden = NAN)
{
string str;

while(true)
{
getline(cin,str);

if(str.find_first_not_of("-.0123456789eE") != string::npos || !(stringstream(str) >> d))
{
cout << "invalid input.\n\n";
}
else if(d == forbidden)
{
cout << "illegal value.\n\n";
}
else
{
break;
}
}
}

void getVar(unsigned & u, unsigned forbidden = NAN)
{
string str;

while(true)
{
getline(cin,str);

if(str.find_first_not_of("0123456789") != string::npos || !(stringstream(str) >> u))
{
cout << "invalid input.\n\n";
}
else if(u == forbidden)
{
cout << "illegal value.\n\n";
}
else
{
break;
}
}
}

int get_num_digits(int i)
{
if(i < 0)
{
i = -i;
}

int result = 1;

while(i > 10)
{
i /= 10;
result++;
}

return result;
}

int get_digit(int i, const int num_digits, const int dig)
{
if(num_digits < dig)
{
return 0;
}

const int dig_p10 = pow(10.0,num_digits - dig);

i -= dig_p10 * round(i/dig_p10);

if (dig < num_digits - 1)
{
i = round(i/int(pow(10.0,num_digits - dig - 1)));
}

return i;
}

string value_of(int i)
{
string str;

if (i < 0)
{
str += "-";
i = -i;
}

const int num_dig = get_num_digits(i);

for(int n = 0; n < num_dig; n++)
{
str += char(get_digit(i, num_dig, n) + NUM_CHAR_SEP);
}

return str;
}

}

#endif /*IO_H_*/

我在这个网站上浏览了很多关于类似现象的问题,但没有一个有帮助。

最佳答案

首先,io_util.cpp 应该在要编译的代码文件的source 文件列表中。项目中任何需要其中包含的功能的地方都应该包括 io_util.h,包括 CollectionBase.h。 不要任何中#include .cpp 文件(即不允许#include "io_util.cpp")。

其次,您的 io_util.h 头文件在 std 命名空间(这也是一个禁忌)中声明了名为 getVar() 的函数。尾部参数的默认参数值属于那里在 io_util.cpp 文件中。

解决这两个问题应该会让您在这条路上走得更远。

关于c++ - .cpp 文件中函数的多个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243829/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com