2012-03-05 21 views
5

Tengo unas macros de uso general que se necesitan universalmente en casi todos los archivos C que escribo. Actualmente los estoy copiando en cada archivo en el que los necesito. Probablemente sea una mala idea porque eventualmente voy a tener que cambiar uno de ellos y luego terminaré con macros definidas de manera incoherente entre los archivos.Reutilizando una macro C en varios archivos

¿Hay alguna forma de crear un archivo de encabezado para macros? Traté de hacer un encabezado con todas mis macros e incluir eso, pero todavía recibo advertencias del compilador.

ACTUALIZACIÓN: Las advertencias específicas que recibo son declaraciones implícitas de funciones como V4 del segundo ejemplo.

Un ejemplo:

//file1.c 
#define COMMON_NUMBER 1 

//file2.c 
#define COMMON_NUMBER 1 

//... 

//fileN.c 
#define COMMON_NUMBER 1 

//Oh wait, it should have been 2 all along..... *facepalm* 

Un mejor ejemplo:

//file1.c 
#include "usefulmacros.h" 

char* prog; 
int optv; 

int main(){ 
    prog = strdup(argv[0]);  
    optv = 4;   // This would be parsed from # of "-v" in argv[] 
    return 0; 
} 

void functionA(){ 
    int dumberror = 1; 
    V4("This is a fairly verbose error: %d",dumberror); 
} 

//file2.c 
#include "usefulemacros.h" 
extern char* prog; 
extern int optv; 

void functionB(){ 
    int differror = 2; 
    V4("This is a different error: %d",differror); 
} 

//usefulmacros.h 
#ifndef USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
+6

¿Qué tipo de advertencias está hablando aquí? ¿Adivinamos? –

+1

En caso de que no lo haya escuchado, hay muy pocos trabajos para los cuales las macros son la mejor herramienta, y pueden causar muchos problemas. Por ejemplo, este 'COMMON_NUMBER' podría ser una variable global' const' (o mejor). – Beta

+0

@JeffMercado: Actualicé mi pregunta con un mejor ejemplo que ilustra lo que está sucediendo en un sentido más específico. – Huckle

Respuesta

6
#ifndef COMMON_INCLUDE_FILE 
#define COMMON_INCLUDE_FILE 

#define COMMON_NUMBER 1 
#define OTHER_COMMON 2 

#endif 

En C, donde las macros son un poco más penetrante que C++, donde te gustaría hacerlo con una estática global, el mecanismo anterior es bastante común. Pones incluir guardias alrededor del cuerpo del archivo, y definir tus comunes allí. Esto es esencialmente lo que config.h termina siendo con autoconf .. Así que nadie puede decir que este no es un mecanismo estándar para el código C.

Simplemente incluya common.h en los archivos que lo necesiten, hecho.

+0

Conozco la estructura # idndef/# define/# endif, agregué más detalles a mi pregunta. – Huckle

+0

Sigue siendo la misma respuesta que la que he publicado, tenga en cuenta que su pregunta _hasta_ carece de la importante '#ifndef COMMON_INCLUDE_FILE \ n #define COMMON_INCLUDE_FILE \ n \ n #endif \ n' .. Eso específicamente es la protección del encabezado eso impide que su inclusión sea preprocesada varias veces (y es la causa de sus errores de definición duplicados). En un subsiguiente 'incluye', si se define COMMON_INCLUDE_FILE, no volverá a procesarlo previamente. – synthesizerpatel

2

Debe definitivamente poner las macros comunes en una sola cabecera para todo el proyecto: la duplicación de código es una cosa peligrosa que hace sus costos de mantenimiento van por el techo.

Las advertencias que ve pueden tener que ver con incluir el mismo encabezado varias veces. Debe usar include guards para evitarlos.

EDITAR (en respuesta a la pregunta de actualización)

Su implementación de guardias incluyen faltan #define USEFULMACROS. Debería ser de la siguiente manera:

//usefulmacros.h 
#ifndef USEFULMACROS 
#define USEFULMACROS 
#define V4(str, ...) if(optv >= 4){printf("%s: "str,prog,__VA_ARGS__);} 
#endif 
0

Verifica la definición de macro de USEFULMACROS con #ifndef pero no la definiste en ninguna parte.

Usted tiene que agregar la línea

#define USEFULMACROS 

después

#ifndef USEFULMACROS