Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-06-2012, 11: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 11:46.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2012, 13: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 13:26.
__ZERO_UNO__ è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2012, 17: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 17:31.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 09: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, 09: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, 15: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 16:20.
Lazy Bit è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2012, 22: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


Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
La Cina ha sviluppato una macchina in gr...
Lanciati cinque nuovi satelliti cinesi G...
Meta avrebbe scaricato illegalmente migl...
QNAP annuncia la funzionalità di ...
Fino a 96 core per chip: la nuova CPU se...
Robot che crescono mangiando i loro simi...
Star Wars Outlaws 2 cancellato: per Ubis...
F1 senza freni: il film supera i 500 mil...
Una supersportiva elettrica da 429 CV a ...
Denodo DeepQuery: ricerche complesse in ...
Pluribus è la nuova ambiziosa ser...
IA come persone: avranno una personalit&...
Scoppia la bufera NSFW: la mano di Colle...
Philips porta OneBlade su Fortnite: arri...
Il consumo dei data center AI esplode: r...
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: 22:06.


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