gpt4 book ai didi

c++ - C++的多重定义。如何正确拆分C++程序?

转载 作者:行者123 更新时间:2023-11-28 08:11:39 25 4
gpt4 key购买 nike

我编写了一个可以正常运行的程序,但我担心的是,当我使用 -Wall 选项编译它时(它是用 C 和 C++ 编写的程序),我会收到很多警告。实际上只有一种类型的警告,但多次出现:Multiple definition of .... (contructors, destructors, and functions)。我以为我做对了,但显然我错了。我有 9 个文件:

Server.h     
Server.cpp - implements methods declared in Server.h

RankingCreator.h
RankingCreator.cpp - implements methods declared in RankingCreator.h

Parser.h
Parser.cpp - implements methods declared in Parser.h

PageHandler.h
PageHandler.cpp - implements methods declared in PageHandler.h

Main.cpp 

——所有的头文件都包含在这个文件中,因为我使用并结合了 所有类的功能在这里

除 Main.cpp 之外的每个 .cpp 文件只包含一个对应的 .h 文件,例如 Server.cpp 包含 #include "server.h"并且没有上面列出的更多 .h/.cpp 文件(但它确实包含标题像 stdio.h 和 string.h )。我可以在这里发布整个警告消息和类代码,但是错误的长度大约是 50 行,所有类大约是 1000 行,所以请告诉我是否真的需要解决这个问题。知道如何解决这个问题吗?我必须让每个函数都内联吗?每个头文件的开头都有#if def block 。

编辑:这是警告日志:

g++ LearnTidyCurl.cpp MyParser.cpp PageHandler.cpp RankingCreator.cpp Server.cpp -lcurl -ltidy -o -Wall Wynik

这是我的一个头文件的代码,参见 ifdefs 的方式:

#ifndef RANKINGCREATOR_H_
#define RANKINGCREATOR_H_


#include <stdio.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>

//using namespace std;

struct rankingElement {
std::string url;
int rank;
bool operator() (rankingElement i, rankingElement j) { return (i.rank > j.rank);}

} ;

bool operator==(const rankingElement& elem, const std::string& url);

class RankingCreator {
public:
rankingElement compareRankingElements;
const static int MAX_QUERY_RESULT_SIZE = 20;
RankingCreator();
virtual ~RankingCreator();
bool checkPageRank( rankingElement rElement, std::vector<rankingElement> &ranking );
void insertIntoRanking( rankingElement rElement, std::vector<rankingElement>& ranking);

};

#endif /* RANKINGCREATOR_H_ */

我扔掉了警告消息,因为它使该主题不可读。顺便提一句。我使用由 Eclipse 自动生成的 include guards——它们不应该很好吗? (创建新类时会自动创建)

编辑:

您可以在此处下载带有错误日志的 gedit 文件:

http://www4.zippyshare.com/v/62324366/file.html

我不想在这里发布 105 行错误,而且它是垃圾格式,所以在这里看起来不太好。

服务器.h :

#ifndef SERVER_H_
#define SERVER_H_

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <sstream>
#include <vector>

...body...

#endif /* SERVER_H_ */

页面处理器.h

#ifndef PAGEHANDLER_H_
#define PAGEHANDLER_H_

#include <tidy.h>
#include <buffio.h>
#include <stdio.h>
#include <errno.h>
#include <iostream>
#include <string.h>
#include <curl/curl.h>
#include <vector>
#include <algorithm>
#include <stdexcept>

... body ...

#endif /* PAGEHANDLER_H_ */

MyParser.h

#ifndef MYPARSER_H_
#define MYPARSER_H_

#include <vector>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <sstream>
#include <algorithm>
#include <queue>
#include <stdlib.h>

...body...

#endif /* MYPARSER_H_ */

main.cpp

#include <stdio.h>
#include <iostream>
#include <queue>
#include "MyParser.h"
#include "PageHandler.h"
#include "RankingCreator.h"
#include "Server.h"

#define NO_ERROR 0

std::string convertIntToString(int input) {

std::ostringstream ss;
ss << input;
std::string tmpStr = ss.str();

return tmpStr;
}

int main(int argc, char **argv) {

... body ...
return 0;
}

MyParser.cpp

#include "MyParser.h"

页面处理器.cpp

#include "PageHandler.h"

服务器.cpp

#include "Server.h"

RankingCreator.cpp

#include "RankingCreator.h"

最佳答案

改变你的包含守卫:

#ifndef FILENAME_H
#define FILENAME_H

//Code

#endif

我敢打赌你的问题就会消失。显然要确保每个 FILENAME_H 都是唯一的 :) 并且记住 - 每个 header 都需要它围绕它的所有代码,但它不应该在你的源文件中。

关于c++ - C++的多重定义。如何正确拆分C++程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931523/

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