Newsgroup: it.comp.lang.c
Titolo: definire nuovo tipo senza tipedef

Salve,
vorrei sapere come sia possibile definire
un nuovo tipo di dato in C senza l' uso
della parola chiave "tipedef".
Ad esempio:
tipedef int MioInt;
come si potrebbe definire?
Luca - 
lucmo...@interfree.it

come si potrebbe definire?
Tu puoi crearli tramite struct, enum o union, pero' per accedervi devi
sempre usare la sintassi:
struct nome_struttura nome_variabile;
union  nome_unione    nome_variabile;
enum   nome_enum      nove_variabile;
In C esiste generalmente un solo modo per fare le cose, quindi perche'
implementare un equivalente del typedef? Sarebbe piu' filosofia Perl
fornire piu' modi per fare le stesse cose :)
Mox


http://www.kyuzz.org/antirez
finger 
ant...@tella.alicom.com
 for PGP key
28 52 F5 4A 49 65 34 29 - 1D 1B F6 DA 24 C7 12 BF

#define MioInt int
Il modo suggerito, sebbene funzioni in alcuni casi, non equivale a
definire un tipo. Non avviene per es in caso di puntatori:
Esempio:
/*definisco un nuovo tipo*/
typedef int * ipointer;
/*creo una define che sostituisca "int *" ogni volta che incontro
ipointer*/
#define int * ipointer;
Non sono la stessa cosa, perche' se io definissi:
gpointer a, b;
Nel primo caso (typedef) avrei a e b come gpointer, e nel secondo caso
"a" come "int *" e "b" solo come "int", perche' si espanderebbe cosi':
gpointer a, b --> int *a, b
Mox :)

 #define MioInt int
Non va bene, non vuol dire definire un nuovo tipo.
Le macro andrebbero evitate, quando possibile.
Come detto + volte, sono fonte d'errori e di 
ambuiguita'.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ambuiguita'.
Potresti fare un esempio concreto che non ti porti via
molto tempo?
Mi chiedo allora l'utilita' di "const" rispetto ad un
"#define": il primo occupa spazio in memoria, il secondo
non occupa alcuno spazio e come "const" non puo' essere
modificato.
Ad esempio:
#define numero 5
"numero" non puo' essere modificato.
Non capisco in quali casi usare "const" se penso che ho
a disposizione una macro che non spreca spazio, anche se
si deve tenere presente che ..."andrebbero evitate, quando
possibile e, come detto + volte, sono fonte d'errori e di
ambuiguita'."
Scusate per il t-i-pedef e per il ritrattato argomento.
Luca - 
lucmo...@interfree.it

molto tempo?
Come semplice esempio mi viene in mente questo
#define SOMMA(A, B) A + B
Ci sono sicuramente molti altri problemi oltre a questi che possono
essere risolti semplicemente con delle parentesi, ma questo dà già
un'idea del perché è così semplice sbagliare usando #define.
-- 
Marco Barisione (ICQ 84277092)



Una mia opinione personale,
in C le macro "semplici" diciamo cosi', 
#define MioInt int
oppure
#devine BUFLEN 2048
non dovrebbero portare problemi,
per le espressioni è meglio evitarle
per sicurezza e portabilità.
Comunque IO credo che typedef sia piu'
leggibile ed autoesplicativo.
Per le costanti, in C  userei i define, storicamente
i define su unix non danno problemi per le costanti.
In c++ userei invece unicamente const lasciando 
che sia il compilatore ad effettuare le sostituzioni in fase di
ottimizzazione e NON il preprocessore.
Se ho detto balle, fatemelo sapere,
NON si finisce MAI di imparare... grazie al cielo :))
-_-

ottimizzazione e NON il preprocessore.
Neanche sotto Windows danno problemi, ma visto che ci sono
le costanti (che conservano un tipo, a differenza delle
macro) non vedo perche' non utilizzarle.
Anche in C si possono usare le const, esattamente come in
C++.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

leggibile ed autoesplicativo.
Non e' questione di leggibilita' (che risulta molto simile) ma di
effetti: con typedef ottieni un certo effetto, con la #define ne
ottieni uno simile e piu' infido (che ti puo' generare errori in modi
inaspettati).
Le macro sono utili, ma non sono quasi mai indispensabili (come le
variabili globali): in alcuni casi possono tornarti comode pero'.
Mi vengono in mente 2 casi in cui in c89 non esiste alternativa:
- ottenere l'effetto di una funzione inline (termine usato in C++:
indica una funzione che viene tradotta dal compilatore non in una
chiamata a funziona, ma in un replace del codice della funzione
chiamata nel codice della chiamante)
- concatenare 2 stringhe a livello di preprocessore
Per il primo in c99 sara' disponibile lo specificatore di tipo
"inline" dal funzionamento analogo al C++.
Mox :)

 modificato.
Il  nuovo standard  C permette  ai compilatori  di trattare  le costanti
definite come  const proprio  come se  fossero dei  #define (a  meno che
ovviamente non venga loro applicato l'operatore &).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
The trouble with computers is that they do what you tell them, 
not what you want.
D. Cohen