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
}
http://stackoverflow.com/questions/389827/namespaces-in-c – Najzero
@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
sys_unicode.h: 39. Non riesco a vedere una riga 39, che l'intero file? –