2010-12-13 16 views
6

Ho un file con un set di funzioni. Per una delle funzioni, voglio scrivere una funzione di supporto che fondamentalmente prende un carattere * e salta tutti gli spazi bianchi.È possibile inserire una dichiarazione di funzione all'interno di uno spazio dei nomi senza nome?

Ecco come ho pensato che dovrebbe essere fatto:

namespace { 
    const int kNotFound = -1; 

    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work? 
} 

void foo(const char *s1, const char *s2) { 
    // do some stuff 

    SkipWhitespace(s1); 
    SkipWhitespace(s2); 

    // continue with other stuff 
} 

void SkipWhitespace(const char *s) { 
    for (; !isspace(s); ++s) {} 
} 

Ma questo mi dà un errore di compilazione. Devo inserire la definizione nello spazio dei nomi senza nome?

+0

si desidera anche rendere la funzione 'nullo SkipWhitespace (const char * & s)' –

+0

si verifica un errore a causa di un errore di battitura nella definizione SkipWhitespace. Dovrebbe essere nullo SkipWhitespace (const char * s) – greatwolf

+0

Era solo un errore di battitura nella fonte pubblicata. – helpermethod

risposta

9

dovete definire nel namespace anonimo così:

namespace { 
    ... 
    void SkipWhitespace(const char *s); // forward declaration - doesn't seem to work? 
} 

void foo(const char *s1, const char *s2) { 
    ... 
} 

namespace { 
    void SkipWhitespace(const char s*) { 
     for (; !isspace(s); ++s) {} 
    } 
} 

Ma a meno che non ci sia una dipendenza ciclica, io non sono sicuro di quello che il valore di questo è. Basta dichiarare e definire la funzione in un colpo solo.

+5

, vale a dire quando la funzione A chiama la funzione B, la funzione B segue anche la funzione A nel codice sorgente. In Java questo non è un problema, ma immagino che in C++ definirlo direttamente sia la strada da percorrere. – helpermethod

2

Un namespace senza nome si comporta come se è stato sostituito con uno spazio dei nomi con un nome generato unicamente immediatamente seguita da una direttiva using.

Questo significa che il vostro dichiarazione di funzione appartiene a uno spazio dei nomi esattamente come se lo spazio dei nomi in realtà aveva un nome. Come tale, la sua definizione dovrebbe vivere nello stesso namespace: o dichiarare contemporaneamente e definire la funzione, oppure aggiungere un racchiude namespace {} dalla definizione (che funziona perché tutte le occorrenze del namespace anonimo in un'unità di traduzione riferiscono alla stessa namespace).

namespace { 

void SkipWhitespace(const char s*) { 
    for (; !isspace(s); ++s) {} 
} 

} 
1

Probabilmente bisogno di vedere questo tema così:

Superiority of unnamed namespace over static?

BTW, il motivo per cui questa funzione:

void SkipWhitespace(const char *s); 

Perché non questo:

void SkipWhitespace(std::string &s); 

??

+0

Sry Non ho detto che si trattava di un compito a casa, dove l'uso della classe std :: string è proibito. – helpermethod

+1

@Helper lol, un compito in C++ con std :: string proibito. Ovviamente, si dispone di alcuni corsi di divertimento ... – stefaanv

+2

Sì, purtroppo è una di quelle strane/C++ corso C in cui si finisce per non sapere né lingua :-( – helpermethod

Problemi correlati