diferencia entre extern “C” y simplemente extern

He visto un código C / C ++ usando extern “C” declarado en firmas de funciones y también mientras incluía un encabezado C en un archivo CPP.

pero algunas funciones simplemente se declaran externas antes de su firma (sin la “C”).

QN1:

¿Estas dos formas de definir funciones tienen el mismo efecto o implican cosas diferentes?

Lo siento si soy muy tonto pero no puedo encontrar esta diferencia a través de Google.

P.ej:

extern int someFunction( void *ret_val); extern "C" int someFunction( void *ret_val); 

QN2:

Si se declara una función con un externo en su firma, ¿es necesario que el archivo de encabezado correspondiente se incluya dentro de un bloque externo “C”?

Como señaló otro usuario en los comentarios, el duplicado marcado no satisface completamente la pregunta aquí. Estoy editando para que en el futuro otros no puedan ser engañados en una pregunta diferente.

extern “C” simplemente significa que el siguiente bloque de código puede comstackrse usando el comstackdor C o Cpp. Esto se hace cuando tiene una mezcla de código C / C ++ y necesita realizar un seguimiento de las características específicas del idioma. De una manera un poco más geek, el enlace C se vuelve compatible en presencia de un comstackdor Cpp.

El código puede ser cualquier cosa, desde una variable / typedef hasta una statement de función / módulo completa.

Pero si haces esto:

 extern char c; // same goes true for extern int foo() 

significa que está diciendo “Estoy usando char c, que tiene una statement externa a este archivo”. Más como en otro módulo en algún lugar de la ruta de búsqueda. Esto es implícitamente global. En tiempo de ejecución, si c cambia, el cambio se refleja en todas partes. Esto se proporciona para que sus directivas de comstackción, como -Iinclude_file_dirs -Ssource_file_dirs etc., se proporcionen correctamente (en GCC o g ++). Usando un IDE poderoso como Visual Studio 2010 o posterior, puedes hacerlo muy fácilmente.

“extern” es una palabra clave de enlace. Puede combinarlo con “C” para directivas de vinculación específicas del comstackdor.

extern “C” desactiva la manipulación de nombres. Permitirá que su código C ++ llame a funciones de la biblioteca comstackda por el comstackdor C

 extern "C" int someFunction( void *ret_val); 

Hará que someFunction tengan enlace C.