|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Provincia di FC
Messaggi: 1807
|
[c] stranissimo problema con #ifndef
ho un problema assurdo: in un header (e sottolineo solo in uno su tutti quelli che compongono il programma) se faccio così
Codice:
#ifndef _HEADER_ #define _HEADER_ #endif Codice:
#ifdef _HEADER_ #define _HEADER_ #endif in tutti gli altri header utilizzo ifndef e va tutto come deve andare, solo su questo ho questo stranissimo problema..
__________________
Lenovo Thinkpad T480s | Steam Deck 256GB | iPhone 14 128GB Ho trattato positivamente con: pupgna,pikerunner,Maldo,Sawato Onizuka,A-ha,darkfable,il.principino |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Hai provato anche ad usare un nome diverso da _HEADER_?
__________________
In God we trust; all others bring data |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Provincia di FC
Messaggi: 1807
|
Quote:
comunque ho provato anche a compilare sotto gnu\linux e fa uguale
__________________
Lenovo Thinkpad T480s | Steam Deck 256GB | iPhone 14 128GB Ho trattato positivamente con: pupgna,pikerunner,Maldo,Sawato Onizuka,A-ha,darkfable,il.principino |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
A parte che
Codice:
#define _HEADER_ Dovresti perlomeno incollare il segmento di codice e l'errore del compilatore, eventualmente tutto il codice se non è troppo lungo/troppo personale. Posta così vediamo un po'
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Provincia di FC
Messaggi: 1807
|
Quote:
Codice:
#ifndef _COUNT_WORDS_ #define _COUNT_WORDS_ char* ultimo_blocco_words=NULL; char* StaccaBlocco(char* blocco, int lunghezza); char* AttaccaBlocco(char* blocco, int lunghezza); #endif Codice:
#ifndef _UTILS_ #define _UTILS_ char Complemento_A_2(char input); int Controllo_Segno(char input); int ControlloEstensione(char* input); #endif Codice:
count_words.o: In function `StaccaBlocco': /cygdrive/c/progetto/count_words.c:8: multiple definition of `_ultimo_blocco_words' main.o:/cygdrive/c/progetto/main.c:13: first defined here collect2: ld returned 1 exit status make: *** [LabProg] Error 1 edit: il problema sembra essere "char* ultimo_blocco_words=NULL;" visto che togliendolo va tutto, ma non capisco perchè visto che la seconda volta dovrebbe saltare tutto il blocco a causa dell'ifndef
__________________
Lenovo Thinkpad T480s | Steam Deck 256GB | iPhone 14 128GB Ho trattato positivamente con: pupgna,pikerunner,Maldo,Sawato Onizuka,A-ha,darkfable,il.principino Ultima modifica di theory : 27-08-2008 alle 18:43. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
non la supportava solo il compilatore micorsoft?
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Il problema è che così facendo definisci una variabile in 2 file
Devi rimuoverla dall'header e definirla solo nel file che ne farà effettivamente uso, e usare eventualmente la keyword extern. Nell'header puoi inserire solo dichiarazioni In ogni caso #pragma once dovrebbe andare anche con gcc.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Provincia di FC
Messaggi: 1807
|
Quote:
-ma come mai con ifdef funzionava? -ma se gli header si utilizzano tramite la direttiva #include, che non fa altro che sostituire il contenuto dell'header nel punto in cui è stata utilizzata, perchè c'è questo "limite" di poter inserire solo dichiarazioni? vi ringrazio in anticipo per le risposte
__________________
Lenovo Thinkpad T480s | Steam Deck 256GB | iPhone 14 128GB Ho trattato positivamente con: pupgna,pikerunner,Maldo,Sawato Onizuka,A-ha,darkfable,il.principino |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
I due casi che hai presentato sono totalmente diversi: nel primo vai a definire una variabile globale (chiamata ultimo_blocco_words), nel caso in cui ti funziona tutto vai semplicemente a definire dei prototipi di funzione (fra l'altro non ti darebbero problemi nemmeno se togli le direttive di compilazione). La variabile ultimo_blocco_words la devi definire in un unico punto. Quello che normalmente viene fatto e' mettere un extern nel file di intestazione: Codice:
#ifndef _COUNT_WORDS_ #define _COUNT_WORDS_ extern char* ultimo_blocco_words; char* StaccaBlocco(char* blocco, int lunghezza); char* AttaccaBlocco(char* blocco, int lunghezza); #endif Codice:
char* ultimo_blocco_words=NULL; Comunque valuta sempre se puoi evitare l'uso di variabili globali
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Potrebbe essere supportato, ma non l'ho provato. In ogni caso, non è standard, quindi si fa bene ad evitarlo quando possibile.
Quote:
![]() In ogni caso, nella seconda variante con #ifdef invece di #ifndef mi sa che non hai definito un bel niente, quando invece nella prima versione l'hai definita due volte in due file diversi (e in fase di linking GCC ovviamente s'incazza). Prova a toglierla di mezzo: se deve essere privata definiscila static e solo in un file, al limite.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:28.





















