PDA

Visualizza la versione completa : [C++] Programma in più file e header


bako
04-05-2006, 22:17
Non ho trovato neanche un topic, ho letto questa guida (http://programmazione.html.it/guide/lezione/1124/appendice-b-struttura-di-grossi-programmi/) però non riesco.
allora esempio ho il programma principale (per comodità chiamo programma.c), e un file con dentro le funzioni (che chiamerò funzioni.c)



programma.c
#include "funzioni.h"

int main {
funzione1(a,b,c);
funzione2(c,d,e);
}

funzioni.c
void funzione1(int a, int b, int c){
....
}

void funzione2(int c, int d, int e){
....
}

funzioni.H
void funzione1(int , int , int );
void funzione2(int , int , int );


questo è un esemipio dello scenario..
ora:
se avessi delle variabile statiche dichiarate cone #define, dove le metto? in un nuovo header va bene (varglob.h) dove devo inculderlo?
i vari .h (come stdio.h) dove vanno messi, basta in un solo .c?
per compilare basta dare gcc -c programma.c; gcc -c funzioni.c; e poi gcc -o *.o.. giusto?
qualcuno mi può spiegare meglio il makefile?

infinitejustice
04-05-2006, 22:36
All'interno dei tuoi file .h dichiare "l'interfaccia", che poi implementi nel rispettivo .c.
Includi le librerie che ti occorrono.

Pero ricordati di fare per ogni .h

#ifndef NOME
#define NOME

...codice...

#endif

In questo modo quando fai i vari #include eviti di aver problemi di definizioni multiple (nel caso ti da errore)

bako
04-05-2006, 22:49
Originariamente inviato da infinitejustice
All'interno dei tuoi file .h dichiare "l'interfaccia", che poi implementi nel rispettivo .c.
Includi le librerie che ti occorrono.

Pero ricordati di fare per ogni .h

#ifndef NOME
#define NOME

...codice...

#endif

In questo modo quando fai i vari #include eviti di aver problemi di definizioni multiple (nel caso ti da errore)

tipo in funzioni.h
devo mettere
#ifndef FUNZIONE
#define FUNZIONE

#endif

così?

infinitejustice
04-05-2006, 23:00
yes. il nome ovviamente lo decidi tu.

bako
04-05-2006, 23:02
Originariamente inviato da infinitejustice
yes. il nome ovviamente lo decidi tu.
e che serve il nome?

andbin
04-05-2006, 23:03
Originariamente inviato da bako
qualcuno mi può spiegare meglio il makefile? Il makefile più semplice che puoi creare per il tuo progetto può essere questo:

programma: programma.o funzioni.o
@gcc -o $@ $?

programma.o: programma.c funzioni.h
@gcc -c -o $@ $<

funzioni.o: funzioni.c funzioni.h
@gcc -c -o $@ $<
Alcune note:
- Il file lo devi chiamare "makefile" o "Makefile".
- Tra l'inizio della riga e il "@gcc" ci deve essere esattamente 1 TAB.
- I vari simboli $@ $< ecc... sono delle variabili speciali. Se vuoi te le posso spiegare. Comunque trovi tutte le informazioni facendo "info make".

bako
04-05-2006, 23:06
nn ho capito l'utilità del make file
io adesso ho 2 file
faccio i .o con gcc -c nomefile.c
poi gcc -o nome1.o nome2.o
ma dice:
shell_05042006_2125.o: In function `main':
shell_05042006_2125.c:(.text+0x186): undefined reference to `parser'
shell_05042006_2125.c:(.text+0x1f7): undefined reference to `last'
shell_05042006_2125.c:(.text+0x25a): undefined reference to `last'
shell_05042006_2125.c:(.text+0x272): undefined reference to `sposta_parametri'
shell_05042006_2125.c:(.text+0x291): undefined reference to `output'
shell_05042006_2125.c:(.text+0x2aa): undefined reference to `input'
collect2: ld returned 1 exit status

ho fatto il .h del file dove c sono le funzioni .. ma nada..

andbin
04-05-2006, 23:07
Originariamente inviato da bako
tipo in funzioni.h
devo mettere
#ifndef FUNZIONE
#define FUNZIONE

#endif

così? In genere si mette una cosa del tipo:

#ifndef __FUNZIONI_H__
#define __FUNZIONI_H__

....

#endif

andbin
04-05-2006, 23:10
Originariamente inviato da bako
nn ho capito l'utilità del make fileServe per "automatizzare" il processo di compilazione. Adesso hai solo 2 sorgenti ma ... se ne avessi 20 o 30, che fai????


poi gcc -o nome1.o nome2.oNo.
gcc -o programma nome1.o nome2.o

bako
04-05-2006, 23:17
Originariamente inviato da andbin
Serve per "automatizzare" il processo di compilazione. Adesso hai solo 2 sorgenti ma ... se ne avessi 20 o 30, che fai????

No.
gcc -o programma nome1.o nome2.o
che diavolo è programma?

adesso io ho così:


function.h
#ifndef __FUNZIONI_H__
#define __FUNZIONI_H__
...
tutte le funzioni
...
#endif




function.c
#include "varglob.h"
...
tutte le implementazioni delle funzioni




varglob.h
#ifndef __VARGLOB_H__
#define __VARGLOB_H__
#include <unistd.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>


#define SIZE_ARG 100

#define SIZE_BUFF 1000
#define N_MAX_FIGLI 10
#define PATH_LENGTH 50
#endif





file.c
#include "function.h"
#include "varglob.h"
il programma che richiama le varie funzioni


come diavolo lo compilo?

Loading