[C] Constanti comuni

hamming_burst
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

"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
Rggb1
"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 100
che ottiene lo stesso risultato? Usa comunque la stessa quantità di memoria (e a seconda dei casi, anche meno).

apatriarca
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:
#define COSTANTE1 10
enum {COSTANTE2 = 10};

Il secondo metodo può essere usato solo per valori interi ovviamente.

Ska1
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:

//// 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 :)

hamming_burst
Grazie delle risposte, mi avete confermato che il modo corretto pere scrivere e condividere costanti, è quello che ho sempre usato :D
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 :-D

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 :-)

Rggb1
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.