2013-04-17 8 views
6

Io non sono un esperto programmatore C++, e sono stato di recente facendo una cosa trucco in C++ che mi sta causando il problema sottostante.Compreso file C++ di intestazione con spazio dei nomi nel file sorgente C causa l'errore di compilazione

Obiettivo del mio compito: thread specifico non di sistema (filettatura cooperativo in realtà) Modulo di sicurezza è duplicato per creare un thread versione del sistema di sicurezza per supportare le diverse esigenze del sistema. Ma invece di creare funzioni sys_XXX per mantenere la compatibilità, abbiamo deciso di creare uno spazio dei nomi per proteggere la versione del thread di sistema in un file di intestazione C++. Posso effettivamente includerlo nel file CPP e lavorare felicemente, ma ho appena realizzato che la mia chiamata funcInit non viene chiamata prima che raggiunga il controllo del file CPP. Sfortunatamente questo init per la versione cooperativa del threading è in un file C. Ora ho bisogno di avviare la mia versione di thread di sistema sicura dallo stesso posto, ma sono stato bloccato dall'errore di compilazione che sono difficili da risolvere dalle mie conoscenze.

compilazione del registro di errore: -

In file included from sysinit.c:87: 
sys_unicode.h:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'SystemThreadUtils' <== corresponds to line [namespace SystemThreadUtils {] 
sysinit.c:88: 
sysinit.c:512: error: expected identifier or '(' before string constant <== corresponds to line [extern "C" bool SystemThreadUtils::funcInit(void);] 
sysinit.c:513: error: expected identifier or '(' before string constant <== corresponds to line [extern "C" bool SystemThreadUtils::funcTerm(void);] 
sysinit.c: In function 'SysInit': 
sysinit.c:817: error: 'SystemThreadUtils' undeclared (first use in this function) <= corresponds to line [SystemThreadUtils::funcInit();] 
sysinit.c:817: error: (Each undeclared identifier is reported only once 
sysinit.c:817: error: for each function it appears in.) 
sysinit.c:817: error: expected ')' before ':' token 
sysinit.c: In function 'SysTerm': 
sysinit.c:2737: error: expected expression before ':' token <== corresponds to line [SystemThreadUtils::funcTerm();] 
sysinit.c:2737: warning: label 'SystemThreadUtils' defined but not used 

Source e frammenti di intestazione FYI: -

file di intestazione C (unicode.h):

// all functions called from the C source file 
funcInit(); 
funcA(); 
funcB(); 
funcTerm(); 

file di intestazione C (unicode.c):

// all functions called from the C source file 
funcInit() { 
} 
funcA() { 
} 
funcB() { 
} 
funcTerm() { 
} 

C++ he Ader del file (sys_unicode.h):

#include "unicode.h" 
namespace SystemThreadUtils { 

    // below functions called from the C source file 
    extern "C" funcInit(); 
    extern "C" funcTerm(); 

    // below functions called from the CPP source file 
    funcA(); 
    funcB(); 
} 

C++ definizione di origine (sys_unicode.cpp):

#include "sys_unicode.h" 

namespace SystemThreadUtils { 

    // below functions are called from C source 
    funcInit() { 
    } 
    funcTerm() { 
    } 

    // below methods are called from CPP source 
    funcA() { 
    } 
    funcB() { 
    } 
} 

CPP fonte # 1 (utils.cpp):

#include "sys_unicode.h" 

using namespace SystemThreadUtils; 

utils::utils_init() 
{ 
    funcA(); 
    funcB(); 
} 

sorgente C# 2 (sysinit.c):

#include "sys_unicode.h" 

extern "C" bool SystemThreadUtils::funcInit(void); 
extern "C" bool SystemThreadUtils::funcTerm(void); 

SysInit() 
{ 
    funcInit(); // non system thread safe version 
    SystemThreadUtils::funcInit(); // system thread safe version 
} 
SysTerm() 
{ 
    funcTerm(); // non system thread safe version 
    SystemThreadUtils::funcTerm(); // system thread safe version 
} 
+0

http://stackoverflow.com/questions/389827/namespaces-in-c – Najzero

+0

@Najzero Grazie per il link così, ma questo non risolve il mio problema. Ho spazio dei nomi nel file di intestazione CPP e ho bisogno di usare questo per evitare confusione con le funzioni C con lo stesso nome. Sia unicode.c che unicode.cpp contengono funzioni x con lo stesso nome. – rajeshk

+0

sys_unicode.h: 39. Non riesco a vedere una riga 39, che l'intero file? –

risposta

19

Non è possibile utilizzare gli spazi dei nomi in C, extern "C", inoltre, non è consentito in C. Quindi, quello che potrebbe essere una soluzione: il modulo C++ definisce un insieme di funzioni in namespace SystemThreadUtils che hanno bisogno di ottenere chiamato C-Code. Dal momento che non è possibile farlo direttamente, si dovrà scrivere un wrapper C-conforme intorno a loro:

//C/C++ - header "sys_unicode_for_c.h" 

#ifdef __cplusplus 
extern "C" { 
#endif 

    void STU_funcInit(); 
    void STU_funcTerm(); 

#ifdef __cplusplus 
} //end extern "C" 
#endif 

//C++-source: sys_unicode_for_c.hpp 
#include "sys_unicode.h" 

extern "C" { 
    void STU_funcInit() { 
    SystemThreadUtils::funcInit(); 
    } 
    void STU_funcTerm() { 
    SystemThreadUtils::funcTerm(); 
    } 
} 

Significato: avete bisogno di un colpo di testa che è il codice C valido e dichiara una funzione di delega per ogni funzione C++ è necessario chiamare da C. La sorgente è in C++ e fa semplicemente la chiamata.

Vedi Calling C++ functions from C file pure.

+0

grazie per il tuo aiuto ha risolto il mio problema. – rajeshk