Newsgroup: it.comp.lang.c++
Titolo: Mi spiegate per favore che significa ???

Salve, sono sempre qui a chiedere il vostro aiuto e la vostra attenzione.
Compilando un sorgente mi capita di ottenere errori del tipo:
Error:  list.h(676,1):Illegal structure operation
Warn :  list.h(679,1):Parameter 'value' is never used
Error:  list.h(690,1):Illegal structure operation
Error:  list.h(707,1):Illegal structure operation
Chiaramente non ha senso cercare degli errori in list.h, ma la cosa che mi
lascia attonito è che se metto una stupidissima riga  alla fine del sorgente
come :
void Sender_p:: prova(void){ }
senza aver dichiarato questo metodo (altrimenti sarebbe punto e daccapo) nel
"sorgente" .h mi spunta invece un errore del tipo:
Error:  sender_p.cpp(390,29):'Sender_p::prova()' is not a member of
'Sender_p'
Se ci fossero altri errori nel sorgente la cosa me la saprei spiegare come
un errore "inventato", ma visto che ci sono solo dei warning, ed io sono già
giunto comunque alla fine del sorgente con la compilazione, qual'è la causa?
I file .cpp vanno "chiusi in qualche modo" con qualche ; o roba simile ? Non
mi pare !!!
Non so che fare !!!
Vi prego, aiuto!!!
Sebastiano.

Error:  list.h(707,1):Illegal structure operation
Hai un file di include scritto da te che precede gli include di
sistema ? Il file che precede list.h e' tuo ?
Un errore comune e' dimenticare che una dichiarazione di
classe richiede il ";" finale dopo la graffa di chiusura;
es:
class A
{
  ...
};       // <-- Questo ";" e' molto importante
Io preferisco comunque sempre mettere gli include di sistema
prima dei miei.
Andrea
PS: Non convivere con i warning. A volte basta poco
    per accontentare il compilatore e avere una
    compilazione pulita e' un bel salvagente (se scrivi
    qualcosa di sbagliato ma compilabile il warning non
    si perde fra migliaia di altri col rischio - la
    certezza ? - di passare inosservato).
    Io compilo sempre con il massimo livello di warning
    consentito (con il VC++ purtroppo non posso perche'
    gli include di sistema altrimenti mi sommergono
    di sengalazioni).
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Si, ho #include <list.h> prima di alcuni include miei....
Ma ora si pone un altro problema, e sarebbe il seguente:
Ho bisogno di includere nel mio file sorgente_1.cpp un sorgente.h ed un
<list.h>.
Questi due li posso mettere nell'ordine di cui tu mi parli, anche se non
capisco il motivo per cui il compilatore si incacchia cosi tanto!!! Non
dovrebbe essere come "Un copia ed Incolla" l'uso degli include?
Il problema è che in sorgente.h mi ritrovo ad includere header_1.h,
header_2.h, ecc. ecc, ed in alcuni dei questi file header devo (obbligo di
legge) includere <list.h>
Come si fa??
Sebastiano





Non ci sono problemi. Gli include di sistema usano tutti delle include
guard. Si tratta di qualcosa tipo
#if !defined(LIST_H_INCLUDED)
#define LIST_H_INCLUDED
// contenuto del file .h
#endif
In questa maniera non ci sono problemi per inclusioni multiple. E'
una buona regola da usare anche per i propri include.
Non dovrebbe esserci problema ad includere i tuoi file prima di
quelli di sistema. L'importante e' che i file di include siano
corretti. Si tratta di un problema di ';' finale ?
Perche' usi il (vecchio) <list.h> invece di <list> ?
Andrea


Scusa la mia ignoranza, ma che differenza c'è ad usare
#include <list.h>
ed
#include <list>
using namespace std ??
Io credevo fosse la stessa cosa.
Per quanto riguarda il tuo consiglio sui codeguard lo metterò subito
all'opera e farò saper i risultati.
Un cordiale grazie,
ancora una volta mi salvi dai pasticci.
Bye,
Sebastiano

 using namespace std ??
<list> e' un header standard, <list.h> no.
Alcune librerie forniscono anche <list.h>, che di solito
e' equivalente a:
  #include <list>
  using std::list;

Aggiungo che non ho nessun ; mancante dopo la }di chiusura di definizione
delle classi, ho controllato bene.
Ho anche modificato un #include<list.h> in #include <list> con l'aggiunta di
using namespace std.... ma niente, non cambia proprio niente.
Che cosa puň essere !!!!
Disperazione.....
:-((((((((((((((((((((((((((((((((((((
Please, helpatemi

 Io credevo fosse la stessa cosa.
Si, dovrebbe essere la stessa cosa. Comunque la seconda forma è quella
ormai standard. Ma ti consiglio anche di non abusare della "using
namespace std;" in quanto distrugge tutti i vantaggi derivanti dall'aver
racchiuso la libreria standard nel namespace chiamato std.
EMG

 wrote :
| Si, dovrebbe essere la stessa cosa. Comunque la seconda forma è quella
| ormai standard. Ma ti consiglio anche di non abusare della "using
| namespace std;" in quanto distrugge tutti i vantaggi derivanti dall'aver
| racchiuso la libreria standard nel namespace chiamato std.
infatti. Per evitare cio' basta
using std::XXXX;
dove XXXX e' la classe che ci serve (list, vector, string...)

Potresti chiarirmi l'ultimo punto, cioč quello dell'abuso e dei vantaggi?
Grazie ancora

Potresti chiarirmi l'ultimo punto, cioč quello dell'abuso e dei vantaggi?
Un namespace costituisce, appunto, uno "spazio dei nomi" e il
vantaggio principale del suo uso e' quello di evitare collisioni tra
nomi di oggetti uguali.
Usare esplicitamente un namespace elimina questo vantaggio, sebbene a
volte sia comodo, in quanto "scopre" gli oggetti definiti all'interno
di esso.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------

 Potresti chiarirmi l'ultimo punto, cioč quello dell'abuso e dei vantaggi?
E' semplice: i namespace sono stati ideati per evitare conflitti di nomi
tra le varie librerie utilizzate (quella standard e le altre).Se tu
"inietti" tutti i nomi della libreria standard nel namespace globale (e
questo č ciň che fa "using namespace std;") ti esponi nuovamente ai
conflitti di cui sopra.
EMG

 di esso.
Puo' andare ancora peggio: un'istruzione "using namespace std;" inietta
nel namespace corrente tutti i nomi del namespace standard ed in
condizioni di conflitto puo' modificare il significato del programma
stesso.
Ciao,
Nicola


