lenguaje - En C, cómo definir una macro usando otras macros, cuando esas otras macros plantean conflictos de nombres
macros en ensamblador 8086 (1)
Compilando comentarios para hacer una respuesta:
Solución A,
si por alguna razón tiene que seguir con "ROW" y "COL" en su código (créditos a melpomene):
enum { ROW = 100 };
enum { COL = 200 };
enum { ARRSIZE = ROW*COL };
Solución B,
si eres libre de elegir identificadores; más robusto para la reutilización futura:
Evite el conflicto de nombres seleccionando identificadores diferentes, no conflictivos y más largos.
Tengo una desconfianza supersticiosa de identificadores cortos y obvios, el conflicto que encontraste es un buen ejemplo de por qué. Otros ejemplos le han costado a mis empleadores bastante tiempo y dinero.
(He visto a melpomene en otro lado no estar interesado en la reputación de una respuesta, muy altruista. Creo que vale la pena hacer un buen par de Q / A aquí y no toma nada de melpomene.)
Esta es una pregunta de seguimiento después de esto (por favor lea mi pregunta hasta el final): ¿cómo evitar conflictos de nombres provenientes de #define en C? (o C ++) Supongamos que defino ROW y COL usando #define. Luego defino ARRSIZE usando ROW y COL. Declaro una matriz estática como float myarray[ARRSIZE];
. Cuando modifico ROW y COL, el tamaño de la matriz estática cambia en consecuencia. Pero en mi caso especial, los nombres ROW y COL conflictos de nombres con un nombre de miembro de un tipo de estructura que estoy usando en el mismo archivo. Alguien me dijo que usara la variable const en lugar de usar ''#define'' para evitar el conflicto. Me gustó el hecho de que modifiqué el código como mejor (es un ejemplo).
const int ROW = 100;
const int COL = 200;
const int ARRSIZE = ROW*COL;
float myarray[ARRSIZE];
Complicando esto me da
error: expected ''='', '','', '';'', ''asm'' or ''__attribute__'' before ''ARRSIZE''
en la línea donde defino ARRSIZE. Por supuesto que puedo usar int ARRSIZE = ROW*COL;
dentro de una función y asignar dinámicamente la matriz dentro de la función utilizando malloc. Pero, ¿qué sucede si solo quiero cambiar ROW y COL y no quiero usar malloc? Por supuesto, no hay ningún problema (excepto los conflictos de nombres) cuando lo haces con #define.
#define ROW 100
#define COL 200
#define ARRSIZE ROW*COL
float myarray[ARRSIZE];
Entonces, el problema: quiero cambiar solo ROW, COL y quiero que el tamaño de la matriz estática cambie automáticamente, pero al mismo tiempo, ROW y COL aparecen como una variable miembro de un tipo (una estructura) en el mismo archivo fuente, y yo no se puede arreglar el nombre del miembro del tipo (supongamos que es de un archivo de encabezado proporcionado por el sistema). Entonces, en una palabra, quiero definir un ''macro como valores'' que no se aplica a una función miembro / variable o variables globales. ¿Cuál es la mejor práctica para hacerlo en mi caso? solo cambio mi variable ROW y COL a algo especial? Después de hacer esta pregunta, me da la impresión de que puede ser la única solución ... :)