Al usar LPCXpresso 1114, no puedo llamar a una función en un archivo C ++ desde un archivo C

0

Tengo un problema similar al descrito en esta publicación:

¿Por qué no se llama a mi SysTick_Handler () en mi proyecto LPCxpresso C ++?

Tengo un par de archivos .cpp, pero el resto son archivos .c. Todo se basa en un archivo, excepto cuando intento hacer referencia a una función independiente en un archivo .cpp desde un archivo .c. Aunque tengo la función completa en el archivo .cpp incluido en:

extern "C" {
    void function( void ) {
       .
       .
       .
    }
}

Todavía obtengo una referencia indefinida a 'function' en el archivo .c de llamada. ¿Algunas ideas? Realmente me ha dejado perplejo y estoy tratando de agregar algo de elegancia a un código muy procedimental mediante el uso de objetos de clase que tienen mucho sentido en esta aplicación.

    
pregunta Gonzo

1 respuesta

1

La función C ++ debe declararse como extern "C" cuando está compilada por C ++, pero no cuando está compilada en C (porque el lenguaje C supone que todas las funciones utilizan la convención de llamada C).

En el archivo de encabezado que declara foo() , use la macro predefinida __cplusplus para incluir la llave de apertura y cierre de la declaración extern "C" .

Este encabezado debe estar #include en ambos códigos, C y C ++, pero la declaración extern "C" solo estará activa para el compilador de C ++.

// near start of the header file...
#ifdef __cplusplus
extern "C" {
#endif

// declaration of function foo
void foo(void);

// ...at the end of the header file
#ifdef __cplusplus
}; // this brace closes the extern "C" declaration
#endif

Al definir la implementación, la función debe ser declarada extern "C":

// foo.cpp
extern "C" void foo(void)
{
    // implementation of function foo
}

En C ++ es legal tener tanto int foo(int) como int foo(double) siempre que ambas funciones tengan el mismo tipo de retorno. Los nombres de funciones se "mancharon con el nombre" para distinguir las diferentes listas de argumentos (por ejemplo, i32fooi32 y i32fooD80). Estos nombres modificados son visibles en el nivel del vinculador, y los diferentes compiladores de C ++ utilizan diferentes esquemas de identificación de nombres. La clave para enlazar con C es evitar la mutilación de nombres por completo. Por esta razón, tanto la declaración como la definición deben estar marcadas como extern "C" .

    
respondido por el MarkU

Lea otras preguntas en las etiquetas