Uso de palabra clave externa

Estoy familiarizado con la palabra clave extern, se usa para declarar una variable presente en algún otro archivo, pero ¿qué significa la siguiente declaración?

extern "C" const IMAGE_DOS_HEADER __ImageBase;

preguntado el 22 de mayo de 12 a las 19:05

¿Qué es? IMAGE_DOS_HEADER? La vinculación de idiomas normalmente solo se aplica a los tipos de funciones (incluidos los tipos de funciones anidadas, como el puntero a la función). -

@James, nombres de variables globales también están destrozados. Sin embargo, su punto acerca de que la vinculación tiene un efecto adicional en las funciones sigue en pie. -

@FrédéricHamidi Mangle está a la altura de la implementación; puede destrozar nada, todo o cualquier cosa en el medio. En la práctica, la mayoría de los compiladores, para la mayoría de los lenguajes, lo han destrozado todo; lo que tradicionalmente ha diferenciado a C++ es la complejidad del esquema de manipulación (incluida la información sobre los tipos de parámetros) para las funciones. Tradicionalmente, C y C++ han alterado los nombres de las variables de la misma manera. (Una verificación rápida con los compiladores que tengo a mano muestra que después extern "C", ni siquiera puedo encontrar el nombre en el archivo de objeto. Lo cual definitivamente no entiendo.) -

2 Respuestas

Significa el __ImageBase usos de variables globales Enlace C y que su nombre debe ser destrozado usando las reglas para C en lugar de C++.

EDIT: Da la casualidad de que Raymond Chen publicado recientemente un artículo eso demuestra que mi respuesta original estaba completamente equivocada: extern "C" no inhabilitar nombre mutilado, solo cambia las reglas solía realizarlo. Los nombres C también se pueden alterar.

contestado el 23 de mayo de 17 a las 13:05

El enlace C implica más que simplemente destrozar; es posible que los argumentos se pasen de manera diferente, por ejemplo. Asimismo, la vinculación idiomática es parte del tipo; una función con extern "C" el enlace no se puede asignar a un puntero a una función de C++. - james kanze

Significa no alterar el nombre del símbolo. __ImageBase que sigue el extern "C". En resumen, garantiza que puede usar la variable en código C++.

extern "C" especificar el vínculo que se aplicará. En resumen, una especificación de vinculación.
Le dice al compilador de C++ que aplique un enlace del tipo de C al símbolo que sigue.

Buena lectura:
Usando extern para especificar la vinculación
Cómo mezclar C y C ++

contestado el 22 de mayo de 12 a las 19:05

El comentario ahora eliminado era correcto, ya que extern "C" es de hecho una construcción solo de C++, pero aún significa que el código C que se vincula al módulo C++ que define esta variable podrá hacer referencia a él... Entonces, en realidad funciona en ambos sentidos, C a C++ y C++ a C (sección 32.6 de las preguntas frecuentes parece estar de acuerdo :). - Frederic Hamidi

@FrédéricHamidi: el compilador AC no entenderá el extern "C" construir, por lo que uno debe envolver el extern "C" { y ` }` líneas en un #ifdef por lo que no serán vistos por los compiladores de C. - Guardar

Sí, aceptamos que no se puede usar fuera de los módulos de C++. Pero permite usar el símbolo decorado si está definido en un módulo C, o permite que los módulos C usen el símbolo si el propio módulo C++ lo define. Eso es lo que quise decir con both ways (pero no sé si en realidad fui más claro esta vez :) - Frederic Hamidi

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.