PDA

View Full Version : [C++] libreria "stdafx.h". Cos'è,quando si usa


Albitexm
19-03-2011, 21:02
L'inclusione della libreria #include "stdafx.h", generalmente quando si fa'?
Questa libreria cos'è? cosa serve?
nota: uso VC++

Tommo
20-03-2011, 02:23
Precompiled header (http://en.wikipedia.org/wiki/Precompiled_header) :D

Albitexm
20-03-2011, 19:02
Precompiled header (http://en.wikipedia.org/wiki/Precompiled_header) :D

Ok, grazie per il link.

tomminno
20-03-2011, 21:32
Comunque non è una libreria ma un semplice header.

megawati
21-03-2011, 16:48
L'inclusione della libreria #include "stdafx.h", generalmente quando si fa'?

La DEVI fare in tutti i file header di un progetto in cui usi MFC.
Quell'header contiene alcune #define e altri dati di base per le MFC, è necessario per il framework di Microsoft.

Se nei tuoi programmi NON usi MAI MFC, allora non lo devi includere mai :)

Albitexm
21-03-2011, 22:24
La DEVI fare in tutti i file header di un progetto in cui usi MFC.
Quell'header contiene alcune #define e altri dati di base per le MFC, è necessario per il framework di Microsoft.

Se nei tuoi programmi NON usi MAI MFC, allora non lo devi includere mai :)

Ma infatti io avevo notato che sia creando un progetto vuoto in VC++ sia usando la procedura guidata per un progetto console o win (dove l'header viene incluso automaticamente) il mio programma gira ugualmente. E non noto differenze, neanche in fase di compliazione (i tempi mi sembrano uguali).
Andrò a studiarmi MFC per capirne l'utilità.
&& "il troppo stroppia.." &&

Albitexm
21-03-2011, 22:50
La DEVI fare in tutti i file header di un progetto in cui usi MFC.

Se nei tuoi programmi NON usi MAI MFC, allora non lo devi includere mai :)

Ho fatto un'esperimento. Ho provato a compilare un'esercizio di un tutorial Microsoft sul parallelismo, in un progetto vuoto. Senza includere "stdafx.h",
e dichiarando la main semplicemente: int main() invece che "int _tmain(int argc, _TCHAR* argv[])", come viene dichiarata automaticamente se si usa la procedura guidata per la creazione di un applicazione console.
Come sospettavo il codice viene compilato ugualmente e funziona.
Riporto il testo del codice esempio del tutorial:

#include "stdafx.h" <ho eliminato questa riga
#include <ppl.h>
#include <stdio.h>
#include <windows.h>

using namespace std;
using namespace Concurrency;

//number of iterations each thread performs
static const int NUM_ITERATIONS = 150000;
int number = 0;


//Demonstrates use of critical section
void FunctionA(critical_section* pMutex)
{
for( int i = 0; i < NUM_ITERATIONS; ++i)
{
pMutex->lock();
++number;
pMutex->unlock();
}
}

//Demonstrates use of critical section

void FunctionB(critical_section* pMutex)

{
for( int i = 0; i < NUM_ITERATIONS; ++i)
{
pMutex->lock();
++number;
pMutex->unlock();
}
}

int _tmain(int argc, _TCHAR* argv[]) <qui ho scritto semplicemente int main()
{
critical_section mutex;
parallel_invoke(
[&] { FunctionA(&mutex); },
[&] { FunctionB(&mutex); }
);

printf("Final value of number: %i\n", number);



return 0;
}

Tommo
21-03-2011, 23:39
Mi chiedo che ho postato a fare il link :doh:
C'è scritto tutto, che sperimenti a fa?

Comunque, stdafx.h è l'implementazione di VC++ dei famosi Precompiled Header; non fa nulla a parte velocizzare notevolmente il tempo di compilazione.

Dentro a stdafx.h devi includere tutti quegli header che cambiano raramente, che vengono compilati in un file .pch a parte che viene riutilizzato, invece che ricompilare il file ogni volta che viene trovato in un'include.
E' utile per cose tipo windows.h, i vari file di opengl, di std, di qualsiasi cosa sia una libreria esterna insomma.

Con MFC non c'entra una benemerita, può essere usato in qualsiasi progetto C++; è solo che il wizard del progetto MFC te lo crea in automatico.

Albitexm
22-03-2011, 16:27
Mi chiedo che ho postato a fare il link :doh:
C'è scritto tutto, che sperimenti a fa?




Te lo spiego perchè ho fatto questa prova :muro: . L'esercizio didattico da me postato, viene proposto in un tutorial sulla PPL. Nel testo viene scritto di andare nella cartella d'installazione e "aprire" il file progetto "esercizio2".
Il progetto visualizza il file d'origine *.cpp con la precompilazione. Allora io mi sono chiesto, l'header incluso non sarà neccessario per fare girare le funzioni PPL? Funzionerà senza?
E' utile per cose tipo windows.h, i vari file di opengl, di std, di qualsiasi cosa sia una libreria esterna insomma.
(PPL non è una libreria esterna?)
Questo non potevo evincerlo dall'utile link postato da te.
Comunque sono giunto alla conclusione che il programma che sto scrivendo, mi conviene scriverlo come progetto vuoto. Poi successivamente aggiungere eventuali ottimizzazioni. Anche perchè in questo modo si potrà usare su qualsiasi compilatore C++ così com'è.

megawati
25-03-2011, 23:11
L'esercizio didattico da me postato, viene proposto in un tutorial sulla PPL. Nel testo viene scritto di andare nella cartella d'installazione e "aprire" il file progetto "esercizio2"

:mbe: Eccavolo certo che non ci fai niente con stdafx.h allora... le MFC non le usi manco di striscio nel tuo programmino di esempio, per cui è ovvio che non ti serve includerlo. Mi chiedo perché hai creato un progetto win32 invece di creare un progetto console, tanto per quello che ti serve è lo stesso e c'è meno roba da capire.

Per quanto riguarda i precompiled headers: non c'entrano una mazza con stdafx.h. E' un caso in cui Wikipedia racconta cazzate (ce ne sono, ce ne sono).

Tutti i compilatori usano e onorano la direttiva #pragma hdrstop, che dice quali header precompilare e quali no: quelli prima di lei sì, quelli dopo di lei no.

STDAFX.H viene citato a (s)proposito dei precompiled headers perché con le MFC, Microsoft ha messo le direttive di inclusione degli header MFC (tutti precompilati, tanto che azz li tocchi a fare???) in stdafx.cpp e stdafx.h.


E non dare retta a Tommo che ne sa pure meno di te :D :D :D

||ElChE||88
26-03-2011, 00:38
:mbe: Eccavolo certo che non ci fai niente con stdafx.h allora... le MFC non le usi manco di striscio nel tuo programmino di esempio, per cui è ovvio che non ti serve includerlo. Mi chiedo perché hai creato un progetto win32 invece di creare un progetto console, tanto per quello che ti serve è lo stesso e c'è meno roba da capire.

Per quanto riguarda i precompiled headers: non c'entrano una mazza con stdafx.h. E' un caso in cui Wikipedia racconta cazzate (ce ne sono, ce ne sono).

Tutti i compilatori usano e onorano la direttiva #pragma hdrstop, che dice quali header precompilare e quali no: quelli prima di lei sì, quelli dopo di lei no.

STDAFX.H viene citato a (s)proposito dei precompiled headers perché con le MFC, Microsoft ha messo le direttive di inclusione degli header MFC (tutti precompilati, tanto che azz li tocchi a fare???) in stdafx.cpp e stdafx.h.


E non dare retta a Tommo che ne sa pure meno di te :D :D :D
Certo che prima di fare il grosso avresti anche potuto informarti meglio.

http://img232.imageshack.us/img232/1148/stdaf.jpg

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently

megawati
26-03-2011, 01:26
Certo che prima di fare il grosso avresti anche potuto informarti meglio.

Certo che prima di postare avresti anche potuto leggere bene cosa ho scritto.
Non hai detto niente, ma quello che hai messo è la dimostrazione di quello che ho detto io. :read:

Bene, visto che sono stato confermato da cotanta fonte (tu), posso pure andare a nanna contento :ciapet:

Tommo
26-03-2011, 12:14
E non dare retta a Tommo che ne sa pure meno di te :D :D :D

E mo questo chi è, kick lock & ban :mc:

||ElChE||88
26-03-2011, 12:15
Certo che prima di postare avresti anche potuto leggere bene cosa ho scritto.
Non hai detto niente, ma quello che hai messo è la dimostrazione di quello che ho detto io. :read:

Bene, visto che sono stato confermato da cotanta fonte (tu), posso pure andare a nanna contento :ciapet:
Ma veramente no.
Hai detto che stdafx.h è legato alle MFC, che è completamente falso.
Crea un progetto ATL, scegli di non usare MFC... ma guarda te, c'è stdafx.h con dentro i header ATL (che non c'entrano nulla con MFC).

È cosi difficile ammettere di aver sbagliato? Sai, per evitare figure di merda...

Albitexm
26-03-2011, 17:01
A parte la discussione sugli headers, i miei dubbi nascevano propio
dalla domanda postulata da te, solo che tu hai sbagliato il soggetto.
Ovvero tu chiedi:
: Mi chiedo perché hai creato un progetto Win32 invece di creare un progetto console, tanto per quello che ti serve è lo stesso e c'è meno roba da capire.

Il fatto che io non "ho creato" un progetto Win 32. L'esercizio che ho aperto
era un progetto Win 32, precompilato dalla Microsoft. Il tutorial dice "apri il progetto", e non "apri il file *.cpp". Quindi io mi chiedevo: "ma sarà necessaria questa precompilazione?" I miei dubbi erano: "perchè la Microsoft propone l'esercizio precompilato in un progetto Win 32? Sarà necessario per le PPL?".

: Non dare retta a Tommo

E anche grazie a Tommo,Tommino,Cionci e gli altri, se io sono riuscito a scrivere un programma funzionante, nonostante sia un neofita. E ho appreso molte nozioni sul C++. Tra l'altro nessuno ha l'obbligo di rispondermi e di consigliarmi. In molti forum "saccenti", i quesiti di un principiante non vengono neanche presi in considerazione. Qua sono sempre stato seguito ed ho sempre avuto una risposta ai miei dubbi.