2013-04-17 5 views
6

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 
} 
+0

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

+0

@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

+0

sys_unicode.h: 39. Ich kann keine Zeile 39 sehen, dass die ganze Datei? –

Antwort

19

Sie können keine Namespaces verwenden in C ist auch extern "C" in C nicht erlaubt. Was also könnte eine Lösung sein: Ihr C++ - Modul definiert eine Reihe von Funktionen im Namespace SystemThreadUtils, die in C-Code aufgerufen werden müssen. Da Sie das nicht direkt tun können, müssen Sie um sie herum ein C-konforme Wrapper schreiben:

//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(); 
    } 
} 

Bedeutung: Sie müssen einen Header, die gültige C-Code ist und erklärt, eine delegierende Funktion für Jede C++ - Funktion muss von C aus aufgerufen werden. Die Quelle befindet sich in C++ und führt den Aufruf aus.

Siehe auch Calling C++ functions from C file.

+0

danke für Ihre Hilfe, es hat mein Problem gelöst. – rajeshk

Verwandte Themen