2009-02-07 16 views

Respuesta

23

No puede. Está integrado en compiladores para permitirle sobrecargar funciones y tener funciones con el mismo nombre en diferentes clases y cosas por el estilo. Pero puede escribir funciones que están destrozadas como funciones de C. Esos pueden ser llamados desde el código C. Pero los que no se puede sobrecargar y no puede ser llamado por C punteros a funciones "normales" ++:

extern "C" void foo() { 

} 

La función anterior se destrozados como funciones C para su compilador. Eso puede incluir ningún cambio en el nombre, o algunos cambios como un "_" al frente o más.

+0

Sólo una nit de menor importancia: Estas funciones sin duda se pueden llamar desde C++ punteros de función: extern "C" vacío foo() {printf ("foo \ n"); } int main() { void (* f)(); f = foo; f(); } –

+0

Creo que te refieres a "desmantelado como las funciones C" :-) – paxdiablo

+4

Los compiladores de Pax, C también pueden deformarse. gcc por ejemplo tiene la opción "-fleading-underscore". Recuerdo que un tipo me dijo que macosx destrozaba sus nombres C con un guión bajo. (No tengo macosx así que no puedo verificar :)). –

6

Otra forma:

Nombres Control de los usados ​​en el código ensamblador (gcc spec.)

Puede especificar el nombre que se utiliza en el código ensamblador para una función C o variable por escrito la asm (o __asm__) palabra clave después del declarador. Depende de usted asegurarse de que los nombres de ensamblador que elija no entren en conflicto con otros símbolos de ensamblador o registros de referencia.

para especificar el nombre del ensamblador para las funciones, escribir una declaración de la función antes de su definición y poner asm allí, así:

int func() asm ("MYFUNC"); 

int func() 
{ 

g++ compilará y nm -D salida será

0000000000001e02 T MYFUNC 

en lugar de

0000000000001e02 T _Z4funcv 

probado en g ++ 4.9.2

Cuestiones relacionadas