[C] Constanti comuni
Salve,
vorrei chiarire un vecchio dubbio che non ho mai risolto nel linguaggio C.
Se avessi delle costanti in comune con molti moduli, il modo per scrivere il modulo che contiene queste costanti è creare un ".h" ed includerlo in tutti i file.
Per scrivere l'header, io ho sempre utilizzato il preprocessore per definire delle costanti e per non creare conflitti con gli identificatori.
Però volevo sapere come riuscire a scrivere correttamene questo header, senza usare il preprocessore (#define, ecc)
se avessi questi moduli
compilando separatamento i moduli, e compilando tutto insieme alla fine, si ha un errore di conflitti di identificatori già definiti.
Come creare questo modulo in comune a tutti i file di un progetto, in modo corretto?
Ringrazio chi aiuta
vorrei chiarire un vecchio dubbio che non ho mai risolto nel linguaggio C.
Se avessi delle costanti in comune con molti moduli, il modo per scrivere il modulo che contiene queste costanti è creare un ".h" ed includerlo in tutti i file.
Per scrivere l'header, io ho sempre utilizzato il preprocessore per definire delle costanti e per non creare conflitti con gli identificatori.
Però volevo sapere come riuscire a scrivere correttamene questo header, senza usare il preprocessore (#define, ecc)
se avessi questi moduli
"const.h" ______________ #ifndef CONST_H #define CONST_H const int max = 10; #endif ______________ "file1.c" ______________ #include "const.h" ______________ "file2.c" ______________ #include "const.h" _______________
compilando separatamento i moduli, e compilando tutto insieme alla fine, si ha un errore di conflitti di identificatori già definiti.
Come creare questo modulo in comune a tutti i file di un progetto, in modo corretto?
Ringrazio chi aiuta

Risposte
"ham_burst":
compilando separatamento i moduli, e compilando tutto insieme alla fine, si ha un errore di conflitti di identificatori già definiti.
Certamente.
"ham_burst":
Come creare questo modulo in comune a tutti i file di un progetto, in modo corretto?
Così come l'hai messo nel tuo esempio non si può fare. Ma qual è il problema a usare per esempio
#define max 100che ottiene lo stesso risultato? Usa comunque la stessa quantità di memoria (e a seconda dei casi, anche meno).
In C, const è solo una promessa al compilatore di non modificare quella variabile. Di fatto, in C, la parola chiave const è meno utile di quanto potrebbe essere e una variabile const non può neanche ad esempio essere usata per definire la lunghezza di un array. I due metodi classici per definire una costante da usare in più file in C sono:
Il secondo metodo può essere usato solo per valori interi ovviamente.
#define COSTANTE1 10 enum {COSTANTE2 = 10};
Il secondo metodo può essere usato solo per valori interi ovviamente.
Vero quanto dice apatriarca, comunque se vuoi fare un qualcosa del genere in generale per variabili globali condivise, ti conviene creare un file ".c" dove le dichiari ed eventualmente le inizializzi e un file ".h" che contiene delle dichiarazione extern:
Compilando e linkando tutto insieme non hai problemi
//// common.c #include "common.h" int my_common;
//// common.h #ifndef __COMMON_H__ #define __COMMON_H__ extern int my_common; #endif
/// Module 1 #include "common.h"
/// Module 2 #include "common.h"
Compilando e linkando tutto insieme non hai problemi

Grazie delle risposte, mi avete confermato che il modo corretto pere scrivere e condividere costanti, è quello che ho sempre usato 
Pensavo, essendoci la dichiarazione "const", in C, che c'era un modo corretto per usare tale parola. Ma in questi anni non riuscivo mai a farla funzionare, ho sempre usato #define, senza sapere che fosse quello il modo corretto (anche perchè vedendolo nel codice di linux, non ho pensato mai di chiedere se era corretto o meno). Fantastico
con questa mi togli ogni dubbio.
non l'ho mai visto usare, in questo modo, sempre utile.
grazie mille, mi avete confermato un dubbio che avevo da parecchio

Pensavo, essendoci la dichiarazione "const", in C, che c'era un modo corretto per usare tale parola. Ma in questi anni non riuscivo mai a farla funzionare, ho sempre usato #define, senza sapere che fosse quello il modo corretto (anche perchè vedendolo nel codice di linux, non ho pensato mai di chiedere se era corretto o meno). Fantastico

Di fatto, in C, la parola chiave const è meno utile di quanto potrebbe essere
con questa mi togli ogni dubbio.
enum {COSTANTE2 = 10};
non l'ho mai visto usare, in questo modo, sempre utile.
grazie mille, mi avete confermato un dubbio che avevo da parecchio

Per la precisione, va bene anche il metodo indicato da Ska, se proprio volessi usare variabili e non costanti. Ma è decisamente un metodo CCS (Complicazioni Cose Semplici) rispetto alle "classiche" #define, che - ripeto - sicuramente non occupano più memoria, e a volte meno.