2017-11-27 3 views
-2

Ich versuche, einen Apple Open Source-Treiberstapel zu erstellen, die IOGraphicsFamily.extern "C" aktiviert C-Header nicht, um C++ reservierte Wörter zu verwenden

Es #includes einige xnu Kernel-Header. Diese sind alle C, aber der C++ Code schützt sie mit extern "C". Allerdings bekomme ich Kompilierungsfehler bei allen C++ - Schlüsselwörtern wie private und new.

Ich sah C Keywords in Google nachgeschlagen, aber nicht gefunden private oder new aufgeführt. Allerdings schlägt der folgende Code zu kompilieren:

bar.cpp:3:13: error: expected unqualified-id 
typedef int new; 
      ^
bar.cpp:6:2: error: expected member name or ';' after declaration specifiers 
     new private; 
     ^

extern "C" { 

typedef int new; 

typedef struct _bar { 
    new private; 
} bar; 

} 

int main(int argc, char **argv) 
{ 
    bar foo; 

    return (int)&foo; 
} 

Es hartnäckig sein würde, alle die C++ Schlüsselwörter in der xnu Code-Basis zu überarbeiten.

Apple ist in der Lage, IOGraphicsFamily zu bauen; Das lässt mich vermuten, dass ich etwas anderes falsch gemacht habe, aber ich habe noch nicht die erforderliche Einsicht.

+7

'extern" C "gibt einfach an, dass Funktionen innerhalb der C-Verknüpfung sind. – tambre

+3

Haben Sie hier ein XY-Problem? Was versuchen Sie eigentlich? typedeffing zu einem C++ - Schlüsselwort scheint wie eine schlechte Form ... –

+2

Sie haben entweder die hartnäckige Aufgabe, diesen Missbrauch von Schlüsselwörtern zu beheben, oder die Aufgabe, einen C-Wrapper zu schreiben, der den Missbrauch verbirgt und in C++ verwendet werden kann. Du hast kein Glück, ich habe Angst. – StoryTeller

Antwort

4

extern "C" ermöglicht es nicht, C-Header C++ reservierte Wörter

Niemand hat gesagt, es würde. extern "C" beeinflusst im Wesentlichen, wie der Compiler/Linker die Suche und/oder den Aufruf der relevanten Funktionen durchführt; Die Parsing-Regeln sind nicht betroffen. Der einzige Ausweg, den ich sehe, ist entweder ein hässlicher hässlicher #define Trick, wie # Definieren der relevanten Schlüsselwörter zu etwas anderem vor den Includes, und #undefinieren sie sofort danach (was möglicherweise nicht funktioniert, wenn solche Bezeichner sich auf externe Symbole beziehen), oder um den Teil Ihres Programms zu kompilieren, der diese Header als einfaches C benötigt, und möglicherweise dazu benutzt, um eine "Brücke" mit dem Rest des C++ Programms zu bilden.

+0

Möglicherweise muss etwas in der Konfiguration von IOGraphicsFamily anders sein, damit es nicht die störenden Header enthält. –

0

Wenn dies getan werden muss, was Sie wahrscheinlich tun müssen, kompilieren Sie den Code mit AC-Compiler, ändern Sie Ihre typedef in eine # define, so dass Sie keine Schlüsselwörter exportieren dann beim Kompilieren Ihrer cpp verwenden Sie das externe für die Überschrift .

somefile.h

#define new int; 

typedef struct _bar { 
    new private; 
} bar; 

#undef new 

somefile.c können Dinge tun, die neue Referenz ... das ist kein Typ, sondern ein lexikalisch int ersetzt

somefile.cpp

extern "C" { 
    include somefile.h 
}