|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2011
Messaggi: 47
|
[C] Piccolo problema con gli #include
Ciao a tutti,
ho suddiviso un programma su più file, ma al momento della compilazione sembra che gli #include non includano come dovrebbero. Il discorso è un po' contorto, ma cercherò di spiegarmi meglio: Il sorgente è costituito da un file_principale.c e un file_principale.h, entrambi nella stessa directory. In file_principale.c è presente un #include "supporto.h", con il quale è mia intenzione caricare sia supporto.h sia il relativo supporto.c (contentente funzioni e definizioni di tipo usate da file_principale.c). Infine, in main.c, scrivo solo #include "file_principale.h". Beh, quando compilo il progetto tutti i file sopracitati sono inclusi, ma il file_principale.c non riconosce le definizioni e le funzioni presenti in supporto.c... Per quale motivo? ![]() main.c -----> #include "file_principale.h" file_principale.c -----> #include "supporto.h" main.c non riconosce le funzioni e i tipi definiti in supporto.c Ultima modifica di Lazy Bit : 24-06-2012 alle 11:46. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
in supporto.h definisci l'interfaccia delle funzioni di supporto ed eventuali classi e attributi. Includi il file supporto.h dal file supporto.c e definisci le funzioni. In file_principale.h includi il file header supporto.h e definisci l'interfaccia delle funzioni principali ecc. In file_principale.c includi il file file_principale.h. In main.c includi file_principale.h.
Utilizza le guardie. supporto.h Codice:
#ifndef _SUPPORTO_H_ #define _SUPPORTO_H_ 1 // ... #endif Codice:
#include "supporto.h" // ... Codice:
#ifndef _FILEPRINCIPALE_H_ #define _FILEPRINCIPALE_H_ 1 #include "supporto.h" // ... #endif Codice:
#include "file_principale.h" // ...
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 Ultima modifica di __ZERO_UNO__ : 24-06-2012 alle 13:26. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2011
Messaggi: 47
|
Ma se scrivo #include "supporto.h" nel file principale non dovrebbe caricarmi automaticamente anche il relativo supporto.c? Sapevo così, eppure mi dà errore... Comunque grazie mille! Adesso funziona
![]() Ultima modifica di Lazy Bit : 24-06-2012 alle 17:31. |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Mar 2008
Messaggi: 47
|
Quote:
In C++ per usare una funzione (o classe, variabile...) devi averla prima dichiarata nello stesso file. Per semplificare le cose si usano le direttive #include<>, così puoi scrivere la dichiarazione una volta per tutte in un file .h e includere quel file dove usi quella funzione. Potresti anche non includere mai nessun file e ripetere ogni volta i prototipi delle funzioni e le dichiarazioni delle classi che usi, ma ovviamente è scomodissimo (soprattutto se modifichi una classe devi ripetere la modifica in ogni file). @__ZERO_UNO__ In C++ tutti i nomi che iniziano con underscore seguiti da una lettera maiuscola sono riservati, non si possono usare, quindi le tue guardie di inclusione non vanno bene. Meglio usare: Codice:
#ifndef SUPPORTO_H #define SUPPORTO_H // ... #endif Codice:
#ifndef NOMEPROGETTO_SUPPORTO_H #define NOMEPROGETTO_SUPPORTO_H // ... #endif |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jul 2009
Città: Milano
Messaggi: 270
|
Non lo sapevo. Ho controllato, hai ragione.
Grazie.
__________________
AMD PII x4 955 BE | Sapphire HD4850 Vapor-X 1 GB | Samsung SpinPoint F1 500GB | Samsung EcoGreen F4 2TB Gigabyte GA-MA790FXT-UD5P | Fractal Design Define R3 USB3.0 Titanium Grey | CORSAIR 650W CMPSU-650TX Noctua U12P SE2 | 2 x 2GB Kingston 1333 MHz | Samsung SyncMaster P2450 | Samsung SyncMaster T200 |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: May 2011
Messaggi: 47
|
Quote:
Sembra, però, che la cosa funzioni solo "al primo livello di inclusione", nel senso che se in supporto.c includo un altro file d'intestazione .h, il meccanismo a catena non funziona più, quindi mi ritrovo ad includere un file.c... Ultima modifica di Lazy Bit : 26-06-2012 alle 16:20. |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Mar 2008
Messaggi: 47
|
Quote:
Quando usi una funzione non ti serve la sua definizione, basta la dichiarazione (il prototipo). Sarà poi il linker a trovare la definizione tra tutte le unità di compilazione (puoi anche provare a scrivere solo un prototipo, la compilazione andrà a buon fine ma il linker darà errore). |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:05.