Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重复符号_C++_Xcode_Linker - Fatal编程技术网

C++ 重复符号

C++ 重复符号,c++,xcode,linker,C++,Xcode,Linker,我正在做一个学校的项目,我从Xcode得到一些奇怪的错误。我正在使用TextMate的Command+R函数编译项目。编译似乎工作正常,但链接失败,并显示一条我不理解的错误消息 ld输出: ld:path/final/build/final.build/Release/final.build/Objects normal/ppc/generics.o和/path/final/build/final.build/Release/final.build/Objects normal/ppc/main

我正在做一个学校的项目,我从Xcode得到一些奇怪的错误。我正在使用TextMate的Command+R函数编译项目。编译似乎工作正常,但链接失败,并显示一条我不理解的错误消息

ld输出:

ld:path/final/build/final.build/Release/final.build/Objects normal/ppc/generics.o和/path/final/build/final.build/Release/final.build/Objects normal/ppc/main.o中的重复符号文本字段(std::basic_istream>&) collect2:ld返回了1个退出状态

下面是我的文件io_functions.cpp这是整个项目中唯一的文本_字段声明

#include <string>
#include <iostream>
#include <iomanip>

using namespace std;

#ifndef ENDF
#define ENDF '|'
#define ENDR '\n'

/**
reads one field from a given input stream
Usage: var = text_field(in)
*/
string text_field(istream &in){
    string s;
    getline(in, s, ENDF);
    return s; 
}

long long_field(istream &in){
    return atol(text_field(in).c_str()); 
}

int int_field(istream &in){
    return atoi(text_field(in).c_str()); 
}

double double_field(istream &in){
    return atof(text_field(in).c_str()); 
}

#endif
#包括
#包括
#包括
使用名称空间std;
#ifndef ENDF
#定义ENDF'|'
#定义ENDR'\n'
/**
从给定的输入流中读取一个字段
用法:var=text_字段(in)
*/
字符串文本_字段(istream&in){
字符串s;
getline(in,s,ENDF);
返回s;
}
long long_字段(istream&in){
返回atol(text_字段(in).c_str());
}
int_字段(istream&in){
返回atoi(text_字段(in.c_str());
}
双双_字段(istream&in){
返回atof(text_字段(in).c_str());
}
#恩迪夫

出什么事了?出于许多原因,我不想发布我的项目的全部源代码

听起来好像io_functions.cpp被包含了两次(一次被generics.cpp包含,一次被main.cpp包含)。

我的第一个想法是你在linker命令中包含了两次,但它似乎在抱怨在
main.o
generics.o
中有相同的函数

因此,看起来您正在将
io_functions.cpp
文件包含到
main.cpp
generics.cpp
中,这在最好的时候是个坏主意

您应该有一个头文件(例如,
io_functions.h
),指定
io_functions.cpp
中包含的所有内容,并将该头文件包含在其他两个头文件中。

使用“inline”关键字复制方法

inline string text_field(istream &in)
内联函数是实际函数,其函数体的副本直接注入函数调用的每个位置


有关详细信息,请参见

ifndef不会阻止这种情况发生吗?仅在编译单元内-这里有两个独立的编译单元。ifndef将阻止您在main.cpp中两次包含该文件。