Ich bin kein Experte C++ - Programmierer, und ich habe vor kurzem eine Trick-Sache in C++, die mir das folgende Problem verursacht.Include C++ - Header-Datei mit Namespace in C-Quelldatei verursacht Kompilierungsfehler
Ziel meiner Aufgabe: Spezifisches Nicht-System Thread (kooperatives Threading tatsächlich) sicheres Modul wird dupliziert, um eine systemthread sichere Version zu erstellen, um verschiedene Bedürfnisse im System zu unterstützen. Aber anstatt sys_XXX-Funktionen zu erstellen, um die Kompatibilität zu erhalten, haben wir beschlossen, einen Namespace zu erstellen, um die System-Thread-Version in einer C++ - Header-Datei zu schützen. Ich kann das tatsächlich in die CPP-Datei aufnehmen und glücklich arbeiten, aber ich habe gerade festgestellt, dass mein funcInit-Aufruf nicht aufgerufen wird, bevor er das CPP-Dateisteuerelement erreicht. Leider befindet sich diese Init für die kooperative Threading-Version in einer C-Datei. Jetzt muss ich meine System thread safe Version von der gleichen Stelle initiieren, aber ich bin durch den Kompilierungsfehler blockiert worden, die von meinem Wissen schwer zu lösen sind.
Compilation Fehlerprotokoll: -
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
Quelle und Header-Schnipsel FYI: -
C-Header-Datei (unicode.h):
// all functions called from the C source file
funcInit();
funcA();
funcB();
funcTerm();
C-Header-Datei (unicode.c):
// all functions called from the C source file
funcInit() {
}
funcA() {
}
funcB() {
}
funcTerm() {
}
C++ er ader Datei (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++ Quellendefinition (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 Quelle # 1 (utils.cpp):
#include "sys_unicode.h"
using namespace SystemThreadUtils;
utils::utils_init()
{
funcA();
funcB();
}
C-Quelle # 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 Danke für den SO-Link, aber das löst mein Problem nicht. Ich habe Namespace in CPP-Header-Datei und ich muss dies verwenden, um eine Verwechslung mit den C-Funktionen mit demselben Namen zu vermeiden. Sowohl Unicode.c als auch Unicode.cpp enthalten x Funktionen mit dem gleichen Namen. – rajeshk
sys_unicode.h: 39. Ich kann keine Zeile 39 sehen, dass die ganze Datei? –