Autor
|
Tema: Duda acerca de macros (Leído 3,083 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Hola, tengo un archivo de cabecera donde defino numerosas macros para el proyecto, a partir de la directiva de preprocesador #define. Pero para definir strings no puedo usar la directiva, por ello creo que es mejor usar "extern const string variable_global", pero en un archivo de cabecera no puedo inicializarla. Entonces surge el problema. Si la inicializo en otro archivo sea cual sea, quedará inicializada con ese valor para todos los demás ¿no?. Si en el main inicializo todas, o a partir de otra función, esa variable queda definida ya para todos los .cpp ¿no? Saludos y gracias. Edito: O poner en el archivo header las variables como: extern const string str1; extern const string str2;
Y en el .cpp poner: extern const string str1 = "idudifu"; extern const string str2="difaodhfio";
Al compilar el proyecto y añadir el header en todos los .cpp estos podrán usar las macros ya inicializadas no? Edito: O bueno siempre se puede usar la opción sencilla y mala, de declararlas directamente en el header como string o lo que sean e incluir el header para cada .cpp que lo necesite, en ese caso se compilarán para cada .cpp varias veces (supongo que #define hará lo mismo), pero sería mucho más sencillo. He probado a declarar el extern y me ha dado 300 fallos not the way.
|
|
« Última modificación: 26 Octubre 2015, 12:17 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
Stakewinner00
|
No entendí muy bien No se que problema se te da. en un archivo de cabecera puedes declarar y definir un valor concreto para una variable global sin problemas... por ejemplo 'const string str1 = "idudifu";' y listo... En este caso esto no es una macro sino simplemente una variable global.
Pasa el código si puedes así aclaramos las dudas.
Saludos.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
En un archivo de cabecera no se deben implementar clases ni inicializar variables, solo se pueden declarar, es lo más correcto.
Partiendo de ahí, quería poner unas variables globales para todo el proyecto, las declaro en un archivo macro.h, luego voy a macro.cpp y las inicializo.
Luego si añado macro.h al main, ¿tendré el valor con las que las inicialice en macro.cpp?, esa es la pregunta.
De todas formas, me he dado cuenta de que lo estaba haciendo mal, porque había usado un archivo .h lleno de #define con cosas de configuración, lo correcto sería dividirlo para cada .h, tengo que cambiarlo.
Saludos.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
La verdad he estado un poco ocupado entre horas, pero lo que he acabado haciendo ha sido distribuir las macros entre los distintos headers para que así no haya macros en códigos que no se vayan a utilizar, lo malo que para cambiarlas tengo que ir de cabecera en cabecera. Me he dado cuenta que extern no vale para nada: extern int casa = 5; Pues es lo mismo que decir int casa = 5; Y declararla como global en una cabecera, para usarla debes incluir su cabecera en el código, luego es lo mismo, que no poner extern, luego es useless. Entonces las variables globales que si use en varios archivos tengo 2 opciones o copiarlas para cada header, o crear un header y añadir el header a los headers. Ahora que lo pienso seguramente usando las directivas de preprocesador quizás podamos hacer que se añadan las que queramos dependiendo del header a las que las estemos añadiendo, es decir crear un header con variables globales compartidas: header_global.h #ifdef CASAS #define casa; int const casita; #else ...
Y en los headers que añadiría header_global.h, pondría #define CASAS si quiero añadir casa y casita, y no poner nada si quiero añadir las demás por poner un ejemplo, aunque no se si valdrá para declarar variables globales en plan "const int casa", o solo macros con #define, que seguramente sea solo lo segundo, pero es algo que mejora la calidad del código en mi opinión hacerlo así. Gracias y un saludo.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Me he dado cuenta que extern no vale para nada:
En absoluto. Para que solo has visto 1 cara de la moneda. Extern sirve para coger variables de otros archivos, sí. Pero sin necesidad de ninguna interaccion entre ellos. Extern coge una variable de un código objeto, NO necesita el código fuente. Esa, es una de las funcionalidades de extern: //a.cpp int a = 5;
//b.cpp #include <iostream> extern int a; int main(){ std::cout << a; }
Compilas ambos a un fichero objetos, y verás que no da problema al linkear. La salida, es la esperada, "5".
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Ya veo, aunque hay que incluit los código fuente o cabeceras en el código fuente que queramos usar la variable, luego es lo mismo que si declaramos una variable en un header y vamos incluyendo el header en códigos, tendremos acceso a ella, sino me equivoco que no estoy seguro pues siempre suelo usar #define.
Aunque no me acaba de convencer esto del extern, mejor considero usar variables globales, y diferenciar variables a definir para cada cabecera como puse anteriormente, porque eso de tener una variable, declararla en un lado inicializarla en otro, luego en otro que ya no sabes ni lo que vale etc XD, mejor variables globales XD.
Saludos.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Ya veo, aunque hay que incluit los código fuente o cabeceras en el código fuente que queramos usar la variable
No, no hay que incluir nada. Es la utilidad de extern.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
No, no hay que incluir nada. Es la utilidad de extern.
Ah vale, es que pense que como ponías lo del "a.cpp" y "b.cpp", pensé que lo necesitaban ok. Saludos y gracias XP
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
g++ -c a.cpp -o a.o g++ -c b.cpp -o b.o g++ a.o b.o -o b.exe En caso de GCC.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Una duda acerca de los Boletines
Sugerencias y dudas sobre el Foro
|
Z0mbie
|
9
|
4,825
|
28 Enero 2004, 16:10 pm
por BADBYTE-K
|
|
|
Duda acerca de DLL
Programación Visual Basic
|
Krnl64
|
1
|
1,765
|
30 Mayo 2006, 07:43 am
por byebye
|
|
|
Duda acerca de POO
PHP
|
Shell Root
|
3
|
2,604
|
19 Septiembre 2011, 06:25 am
por Nakp
|
|
|
Duda sobre los macros
Programación C/C++
|
amchacon
|
4
|
2,001
|
24 Mayo 2013, 02:02 am
por amchacon
|
|
|
Duda usando macros en GAS
ASM
|
0and6
|
1
|
2,402
|
3 Julio 2017, 23:49 pm
por ivancea96
|
|