[C++] Kompilacja programu składającego się z kilku plików


(Kanaliaon) #1

Witam, mam program składający się z 3 plików:

p021.cpp

#include 

#include "nagl.h"

#include "p021a.cpp"


using namespace std;



int main()

{

	cout << "Podaj a: ";

	cin >> a;

	cout << "Podaj b: ";

	cin >> b;

	cout << endl << wieksza(a,b) << endl;

	druga();


}

inline int wieksza(int a, int b)

{ 

	if(a>b)

	{

		return a;

	}

	else

	{

		return b;

	}


}

p021a.cpp

#include 

using namespace std;

#include "nagl.h"


void druga(void)

{

	while(i>0)

	{

	cout << wieksza(a,b);

	i--;

	}

}

nagl.h

extern int a,b;

int i=10;

inline int wieksza(int, int);

void druga(void);

Kompilator (VC++ 2008 EE SP1) przy kompilacji wyrzuca błąd:

Co jest źle i jak to naprawić?

Jest to ćwiczenie XXIX/rozdział 5 z nowej Symfonii


(Marcinch7) #2

Spróbuj tak...


(Kanaliaon) #3

4 errory...


(Fiołek) #4

Funkcje inline nie mogą mieć deklaracji(prototypu) i definicji w dwóch różnych miejscach. Wszystkie externy muszą gdzieś być zdefiniowane, czyli musisz gdzieś wpisać "int a,b;" nawet gdy użytkownik podaje wartość.


(Quentin) #5

W p021.cpp (swoją drogą ciekawe nazwy pliku) funkcja inline musi być na górze, tzn. przed jej wywołaniem bo tak jak napisał Fiołek funkcja inline musi być od razu zdefiniowana (najlepiej wsadź ją do pliku .h i ogranicz pragmą once).

Po drugie do obu plików włączasz definicję:

int i = 10

Więc kompilator wywala ten właśnie błąd:

Wywal definicję z pliku nagłówkowego i wsadź ją do pliku p021a.cpp.

Po trzecie - co znaczy #include "p021a.cpp" :shock: Te pliki same się połączą na etapie linkowania, więc to jest niepotrzebne.

nagl.h :

extern int a, b;

void druga(void);


#pragma once

inline int wieksza(int a, int b)

{

   if(a>b)

   {

      return a;

   }

   else

   {

      return b;

   }

}

1_plik.cpp :

#include 

#include "nagl.h"

using namespace std;

int b, a;

int main()

{

   cout << "Podaj a: ";

   cin >> a;

   cout << "Podaj b: ";

   cin >> b;

   cout << endl << wieksza(a,b) << endl;

   druga();

}

2_plik.cpp :

#include 

using namespace std;

#include "nagl.h"

int i = 10;

void druga(void)

{

   while(i>0)

   {

   cout << wieksza(a,b);

   i--;

   }

}

Marcin1147 , to nie klasyczny C, że przez domniemanie jest tam podstawiany int:

i=10;

([alex]) #6

Zamiast #pragma once wystarczy dać static, no i może warto trochę skompresować:

static inline int wieksza(int a, int b) { return a>b?a:b; } [/code]

Trochę bardziej kompaktowy zapis, co? :smiley:


(Quentin) #7

To co ja włączyłem to tzw. strażnik nagłówka. Będzie o tym w rozdziale 6, jeżeli tego nie rozumiesz. A co do kodu alexa , to czytałem, że teraz stosuje się po prostu anonimową przestrzeń nazw :slight_smile:

namespace

{

         //...

}

PS. Leogict - po co kopiujesz ten sam temat na 5 różnych for :?:

:arrow: http://pecetforum.info/forum/viewtopic.php?t=1373

:arrow: http://elportal.pl/forum/viewtopic.php?p=53218#53218

:arrow: http://forum.ep.com.pl/viewtopic.php?p=85911

:arrow: http://www.elektroda.pl/rtvforum/topic1259760.html


(Kanaliaon) #8

Anonimowa przestrzeń nazw w pliku nagłówkowym czy w .cpp ?


(Quentin) #9

W pliku nagłówkowym.

extern int a, b;

void druga(void);


namespace

{

// **************************************************

     inline int wieksza(int a, int b)

     {

            if(a>b)

            {

                  return a;

            }

            else

            {

                  return b;

            }

     }

// **************************************************

}