Domanda

ho questo file:

//Q2a.h
#ifndef Q2A_H
#define Q2A_H

inline int MyFactorial(int a)
{
if (a < 2)
    return 1;
return a*MyFactorial(a-1);
}

int NumPermutations(int b);
#endif

//Q2a.cpp
#include "Q2a.h"

int NumPermutations(int b)
{
    return MyFactorial(b);
}

and file with the main- Q2b.cpp

Ho notato che il compilatore di solito ignorare il decleration linea quando ci sono funzioni ricorsive. ma la mia domanda è: perché se mi tolgo la dichiarazione di linea, posso fare:

g++ -Wall -g -c Q2a.cpp -o Q2a.o
g++ -Wall -g -c Q2b.cpp -o Q2b.o

quelli sono bene, ma in fase di collegamento:

g++ -Wall -g -c Q2a.o Q2b.o -o Q2

ho un errore: la definizione multiplo di `MyFactorial (int)

È stato utile?

Soluzione

Perché quando si #include "Q2a.h", si sta essenzialmente facendo una sostituzione di testo dei contenuti, in modo da entrambi Q2a.cpp e Q2b.cpp finiscono per la definizione di una funzione chiamata MyFactorial(). Si sia bisogno di usare inline, o definire la funzione in uno dei file di origine.

Si noti che usare inline non aiuterà molto con una funzione ricorsiva!

Altri suggerimenti

Con GCC dichiarare una funzione come inline sarà solo accennare al compilatore di inline la funzione. Tuttavia, il compilatore genera ancora una funzione non inline che è possibile chiamare da un'unità di compilazione diverso.

Queste funzioni aveva un nome collisione nel tuo caso. È presto detto: inline non implica static

.

Che cosa si vuole fare è quello di dichiarare le funzioni come static inline

Questo dirà la compilazione che si desidera la vostra funzione inline, e - se il compilatore decide di inline esso - non è necessaria alcuna versione statica della stessa funzione. Esso OTOH il compilatore non può in linea la funzione che farà in modo che la funzione è statica, ad esempio il nome della funzione è locale rispetto al C-lima e non conflitti di nomi durante il collegamento del programma si verificherà.

Suggerimento:

I compilatori hanno un comportamento diverso. Se si vuole compilare il codice su una piattaforma diversa in futuro fare in modo che si nasconde la definizione in una macro.

Per esempio devo usare static inline per il GCC e Visual Studio e un semplice _inline per il compositore Codice TI DSP / embedded ARM compilatore. Il compilatore poi non capisce una linea semplice, perché è non-standard e non capirà _inline statica sia.

Quando si dichiara una funzione inline si modificano le regole che si applicano per le definizioni di vostra funzione.

Una funzione non inline deve essere definito solo una volta in un programma; al contrario una funzione inline può essere definito in più unità di traduzione, anche se le definizioni devono essere identici e la funzione deve essere definita in ogni traduzione in cui viene utilizzato.

Rimuovendo inline, si sta rimuovendo l'esenzione dal "una regola definizione" che si aveva in precedenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top