Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

include stdafx.h in header or source file?

I have a header file called stdafx.h and this one is precompiled of course. I've read that I should include these files into my .cpp files, but some of these statements are already needed in the header file coming with that.

Should I add the stdafx into my header or into my cpp? I thought it was good practise to put it into the header, but I seem to be obliged to put it into the header instead.

Example:

stdafx contains freeglut.
my class header file has an attribute of GLenum.

Should I include the stdafx into the .h of the class?

like image 393
Marnix Avatar asked Mar 08 '11 15:03

Marnix


People also ask

Why we use #include Stdafx h?

stdafx. h is basically used in Microsoft Visual Studio to let the compiler know that the files are once compiled and no need to compile it from scratch.

Do I include the header file in a source file?

h should be included into each and every one of your source files, before you include anything else. It shouldn't be included in any other header files, but it doesn't matter if it is. stdint. h and stdbool.

What is #include Stdafx h in C++?

#include "stdafx.h" The file stdafx. h is usually used as a precompiled header file. Precompiled headers help to speed up compilation when a group of files in a project do not change.

What is a Stdafx h file?

h (named stdafx. h before Visual Studio 2017) is a file generated by the Microsoft Visual Studio IDE wizard, that describes both standard system and project specific include files that are used frequently but hardly ever change. The afx in stdafx. h stands for application framework extensions.


2 Answers

stdafx.h should be the first include in EVERY cpp file in your project.


Consider that C++ doesn't compile header files, just Cpp files.

Therefore if the stdafx is the first include in the cpp file, then the compiler will have everything the header file needs, when it hits the header-file in the Cpp file.

e.g.

You have A.cpp & A.h.
A.h needs std:string.

you have B.cpp & B.h
B.h needs A.h therefore B.h needs std::string too.

Because it's good practice, you put #include <string> in stdafx.h.

Your build fails because nothing can see std::string

Now put stafx.h as the first include in A.cpp and B.cpp.
When the compiler hits A.cpp, it picks up the include for <string>, then picks up A.h, and everything is happy because we know what std::string is.

The compiler now hits B.cpp, again it includes stdafx first, which brings <string>, then hits B.h, which brings A.h which is again happy because std::string has already been included.

Hope this helps.

like image 90
Binary Worrier Avatar answered Sep 18 '22 15:09

Binary Worrier


  • Only include things in your precompiled header which should be there
  • Your precompiled header file must be the first include in every .cpp
  • I would avoid including it in another header in favor of forward declaration

Ask yourself these two questions before including something in stdafx.h

  1. Will this header never be changed by me?
  2. Do I need this included in every multiple source file?

If the answer is "No" to either of those then don't include it.

like image 34
AJG85 Avatar answered Sep 20 '22 15:09

AJG85