Wenn ich eine Funktion in einem .c wie
habe %Vor%... in meinem .obj wird dies ein Symbol mit dem Namen
%Vor%... gemäß den C-Namen-Mangling-Regeln. Wenn ich eine ähnliche Funktion in einer CPP-Datei habe, wird dies etwas ganz anderes, wie bei den compilerspezifischen Regeln für die Namensänderung. msvc 12 gibt uns folgendes:
%Vor%Wenn ich diese Funktion foo in der .cpp-Datei habe und ich möchte, dass sie C-name-Mangling-Regeln verwendet (vorausgesetzt, ich kann ohne Überladung auskommen), können wir sie als
deklarieren %Vor%... in diesem Fall sind wir wieder bei guten alten
%Vor%... in der .obj-Symboltabelle.
Meine Frage ist, ist es möglich, anders herum zu gehen? Wenn ich C ++ - Namen-Mangling mit einer C-Funktion simulieren wollte, wäre dies mit gcc einfach, da die gcc-Namensveränderungsregeln nur identifierfreundliche Zeichen verwenden, daher wird der verstümmelte Name von foo _ZN3fooEic und wir könnten leicht
%Vor%Zurück im Microsoft-Compiler-Land, kann ich natürlich keine Funktion erstellen, deren Name eine vollständig ungültige Kennung namens
ist %Vor%... aber ich möchte immer noch, dass diese Funktion mit diesem Symbolnamen in der OBJ-Symboltabelle angezeigt wird.
Irgendwelche Ideen? Ich habe die unterstützten Pragmas von Visual C ++ durchgesehen, und ich sehe nichts Nützliches.
Sie haben Recht. Das ist nicht (direkt) möglich (Achtung: vertraue VSC ++ nie). Es gibt jedoch eine nette Problemumgehung, wenn Sie dies wirklich benötigen. Zuallererst, in der C ++ Datei ...
%Vor%Dann in der C-Datei ...
%Vor% Ohne einen fehlenden Namen eingeben zu müssen, können Sie nun die Funktion foo
aufrufen, die eigentlich nur ein Wrapper um die C-Funktion proxy
ist. Dies gibt Ihnen den gleichen Effekt, als wäre proxy
tatsächlich foo
, aus der Sicht von C ++. Die einzige Strafe hier ist natürlich ein kurzer 'n' schmutziger Funktionsaufruf. Wenn der ABI dies zulässt und der Compiler intelligent genug ist, kann dies durch eine einzige JMP
x86-Anweisung ersetzt werden.
Ein anderer Weg wäre, eine Funktion foo
in C zu schreiben und dann MinGWs objcopy
zu verwenden, um das Symbol umzubenennen ...
Ich bin nicht sicher, ob das nur mit VSC ++ Tools möglich ist. Es wäre sowieso sehr instabil, unportabel und hacky.
Tags und Links c c++ gcc visual-c++ linker