简体   繁体   中英

How to properly include the same .h file in two separate .cpp files?

I have a project consisting of 6 files; main.cpp , functions.h , tennisplayer.h , tennisplayer.cpp , tennisteam.h & tennisteam.cpp which are roughly defined as follows:

// main.cpp

#include "tennisteam.h"
#include <iostream>
#include <string>
#include <exception>

// some main() code that needs functions.h definitions
// functions.h

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include "tennisplayer.h"
#include <iostream>
#include <string>
#include <limits>

// some constants & function definitions needed by both main.cpp & tennisteam.cpp

#endif
// tennisplayer.h

#ifndef TENNISPLAYER_H
#define TENNISPLAYER_H

#include <string>
#include <vector>

// tennisplayer class declarations

#endif
// tennisplayer.cpp

#include "tennisplayer.h"
#include <iostream>
#include <fstream>

// tennisplayer class definitions
// tennisteam.h

#ifndef TENNISTEAM_H
#define TENNISTEAM_H

#include "tennisplayer.h"
#include <string>
#include <vector>

// 

#endif
// tennisteam.cpp

#include "tennisteam.h"
#include <iostream>
#include <fstream>

// tennisteam class definitions

However, when I include functions.h into both main.cpp & tennisteam.cpp via tennisteam.h I get a linker error along the lines of:

/usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccv30cX0.o:tennisteam.cpp:(.text+0x0): multiple definition of `function(std::string const&)'; /tmp/ccRThgpp.o:main.cpp:(.text+0x0): first defined here

I'm aware this is a linker error. I've looked around for a fix but all I come across are posts instructing me to use include guards which I have done already. Is there something I'm missing here? Any help would be appreciated.

You have function function(std::string const&) that you not only declared but also defined in your header file. If you need to have it defined there instead of a.cpp file, mark it as inline .

This results in two cpp files (namely main.cpp and tennisteam.cpp) ending up with a definition of that function, because they both include that header file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM