Pregunta

Por ejemplo: si tengo dos archivos .h

proceso1.h y process2.h

y contienen dos funciones con diferentes variables de salida.

proceso1.H:

function(int var)
 {
 return 2*var;
}

proceso2.h:

function(int var)
 {
 return 10*var;
}

¿Se puede hacer esto en Main.c:

int main()
{
int a = 2;
#include "process1.h"
printf("%d",function(a));    //output is 4

EXCLUDE #INCLUDE "process1.h" ?????    <----can this be done in any way??
#include "process2.h"
printf("%d",function(a));    //output is 20

}
¿Fue útil?

Solución

No, no puede "desbloquear" un archivo. Piense en todas las directivas del preprocesador (líneas que comienzan con #) como sucediendo antes de El compilador C real incluso ve el archivo fuente. Simplemente operan en el texto del archivo, y el preprocesador podría implementarse como un paso separado que solo alimenta el texto nuevo al compilador real.

La mejor manera de modificar las acciones de un include Dependiendo de la persona que llama es usar más macros dentro de los archivos incluidos, que pueda #define antes de incluirlos.

Aún así, su sintaxis general está apagada, no puede (típicamente) funciones de nido en C.

Otros consejos

No, y no debe intentar escribir un programa con dos funciones del mismo nombre.

En el caso especial de que las funciones se definen realmente en el archivo de encabezado (en lugar de solo prototipos), usted pueden hacer esto:

#define function function_file1
#include "file1.h"
#undef function

#define function function_file2
#include "file2.h"
#undef function

int
main (void)
  {
    int a = 2;

    printf ("%d\n", function_file1 (a));
    printf ("%d\n", function_file2 (a));
  }

PERO Si cambia el nombre de un prototipo de función, entonces no ha cambiado el nombre de la función real, por lo que obtendrá un error de símbolo indefinido cuando vincule.

En cualquier caso, si tiene dos funciones definidas con el mismo nombre, entonces no se vinculará de todos modos, no importa qué más haga en las fuentes. (En C ++, a veces es posible definir dos cosas con el mismo nombre, pero la regla de una definición significa que el enlazador puede asumir que son las mismas cosas realmente y solo eligen una).

Es por eso que se supone que las bibliotecas usan nombres que no se utilizarán en otro lugar, generalmente agregando un prefijo común a todos los nombres de símbolos (por ejemplo, my_unique_lib_initialize()).

¿Por qué no usar la matriz de punteros de funciones? Seguro que debe inicializarlo al principio, pero creo que probablemente resuelva lo que desea hacer.

int process1_function(int var);
int process2_function(int var);

int main(void)
{
    int i, a = 10;
    int (* functions[2])(int);

    functions[0] = process1_function;
    functions[1] = process2_function;

    for(i=0; i < 2; i++)
    {
        printf("%d", (functions[i])(a));
    }

    return 0;
}

Si no necesita cambiar dinámicamente a qué función va a llamar, también puede prefijo las funciones:

int process1_function(int var);
int process2_function(int var);

int main(void)
{
   printf("%d",process1_function(a));
   printf("%d",process2_function(a));

   return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top