Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-06-2012, 12:42   #1
Lazy Bit
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 12:46.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2012, 14:20   #2
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
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
supporto.c
Codice:
#include "supporto.h"
// ...
file_principale.h
Codice:
#ifndef _FILEPRINCIPALE_H_
#define _FILEPRINCIPALE_H_ 1
#include "supporto.h"
// ...
#endif
file_principale.c
Codice:
#include "file_principale.h"
// ...
Ciao
__________________

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 14:26.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2012, 18:24   #3
Lazy Bit
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 18:31.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 10:32   #4
bender86
Member
 
L'Avatar di bender86
 
Iscritto dal: Mar 2008
Messaggi: 47
Quote:
Originariamente inviato da Lazy Bit Guarda i messaggi
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
No. La direttiva del preprocessore #include<nomefile> si limita a copiare pari pari il file nomefile nel file corrente (eventualmente espandendo altre direttive del preprocessore). Il contenuto di nomefile, o se esista un nomefile.c, è completamente irrilevante.
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
o ancora meglio:
Codice:
#ifndef NOMEPROGETTO_SUPPORTO_H
#define NOMEPROGETTO_SUPPORTO_H
// ...
#endif
bender86 è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 10:39   #5
__ZERO_UNO__
Member
 
L'Avatar di __ZERO_UNO__
 
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
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2012, 16:46   #6
Lazy Bit
Member
 
Iscritto dal: May 2011
Messaggi: 47
Quote:
Originariamente inviato da bender86 Guarda i messaggi
No. La direttiva del preprocessore #include<nomefile> si limita a copiare pari pari il file nomefile nel file corrente (eventualmente espandendo altre direttive del preprocessore). Il contenuto di nomefile, o se esista un nomefile.c, è completamente irrilevante.
Credo che in parte abbia anch'io ragione. Infatti, se in main.c includo supporto.h (quest'ultimo contenente solo i prototipi di funzione), automaticamente è caricato supporto.c (che contiene le definizioni). Questo è sicuro (provare per credere)!

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 17:20.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2012, 23:52   #7
bender86
Member
 
L'Avatar di bender86
 
Iscritto dal: Mar 2008
Messaggi: 47
Quote:
Originariamente inviato da Lazy Bit Guarda i messaggi
Credo che in parte abbia anch'io ragione. Infatti, se in main.c includo supporto.h (quest'ultimo contenente solo i prototipi di funzione), automaticamente è caricato supporto.c (che contiene le definizioni). Questo è sicuro (provare per credere)!
No, è sicuro che se includi supporto.h includi solo supporto.h, nient'altro (con ovviamente i file inclusi in supporto.h). Dovresti spiegare cosa intendi con "caricato".
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).
bender86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Vast prosegue la costruzione della stazi...
Chiarito cosa è successo al satel...
Il TAR annulla Bologna Città 30. ...
Laptop con chip NVIDIA da marzo? Emergon...
Costruito in casa, più veloce di ...
Il nuovo Galaxy Book 6 Pro costa il 25% ...
C'è un boom del mercato dei data ...
OVHcloud annuncia la disponiiblità...
Il Wi-Fi 7 ha un nuovo re: da ASUS arriv...
In arrivo l'auto "Frankenstein"...
Chip NVIDIA H200 in Cina? 'Come vendere ...
iPhone 16 torna super conveniente: ora c...
Offerte Amazon pazzesche: tech, smartpho...
Ubisoft annuncia l'arrivo dei 60 fps per...
Infratel Italia: ecco la nuova mappa del...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:04.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v