views:

1125

answers:

4

Update:

What are the effects of including stdafx.h in my header files?


I started on a C++ project in Linux/Eclipse CDT and imported it into Visual C++/Windows.

In Visual C++, I started using precompiled headers to speed up compilation and defined stdafx.cpp and stdafx.h.

Here's my stdafx.h

#pragma once

#include <string>
#include <vector>
#include <map>
...

and my stdafx.cpp

#include "stdafx.h"

In every .h and .cpp file, I have the following:

#pragma once //if in a header file
#include "stdafx.h"

For both release and debug, I have "Create Precompiled Header (/Yc)". It compiled fine in debug mode, but in release mode it keeps reporting

error LNK2005: ___@@_PchSym_@00@UfhvihUaszlaDUwlxfnvmghUnnlUhixUnnlPeDUnnlPeDUivovzhvUvmgrgbOlyq@ already defined in A.obj

If I switch both to "Use precompiled header", I get in both Debug and Release

fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file:

Does anyone know what's going on?

+4  A: 

You put the #pragma once before the #include "stdafx.h" which I think is causing the compiler to ignore the #pragma once directive.

Also, I don't think you should be putting the #include "stdafx.h" line into the header files at all.

GBegen
Yup, you usually put #include "stdafx.h" as the first include of every .cpp file. I think it might actually have to be the first non-comment line.
Soo Wei Tan
So basically I have to include my own header files in the PCH? What about the expensive to compile headers (boost) referenced in my own headers?
jameszhao00
For example, if I reference Boost in both stdafx and my_class.h, in my_class.cpp the Boost referenced in my_class.h will be skipped because stdafx already referenced it?
jameszhao00
Even if a header must be included elsewhere, a good bit of the processing only has to happen as pare of the pre-compile. You are including headers in the PCH to minimize processing, you are including headers elsewhere to provide type information and define constructs. The includes are serving separate purposes.
Aidan Ryan
While this answer points out some issues, it does not actually answer the question as far as the linker errors.
Aidan Ryan
@Aidan: No, it doesn't work that way. Any header you include in stdafx.h is by transitive inclusion available everywere. Hence, you don't need to include those headers again. It's harmless, though, because Boost headers have include guards.
MSalters
+6  A: 

You put "create precompiled header" only for stdafx.cpp. Then "use precompiled header" for all of the other ".cpp" files. Finally, have include "stdafx.h" at the start of each ".cpp" file (not usually in the header files.

1800 INFORMATION
I can only set a config-wide Create PCH or Use PCH.
jameszhao00
In VS, you can right click on an individual file and choose "properties". Then under "C++ -> Precompiled headers" you can set the value to "create" or "use". The config wide setting is used as a default - you should probably set this to "use", then override it for the stdafx.cpp
1800 INFORMATION
So what are the effects of including stdafx.h in my header files?
jameszhao00
There's not really any effect because a header itself does not define a compilable unit, they're only part of other compilable units.
Aidan Ryan
+2  A: 

The /Yc compiler option is used to create a pre-compiled header for a compilation action. The /Yu option instructs the compiler to use a pre-compiled header.

You will always use the /Yu option in project settings. In the property pages for your stdafx.cpp file, the /Yc option will be set.

It is important to understand that there are separate compilation options for each .cpp file .

See here for details of the /Y options.

Aidan Ryan
Ah I see. Thanks.
jameszhao00
+1  A: 

The results of using "stdafx.h" are not influenced by the PreCompiled Header system. If you turn off Create PCH/Use PCH, the code compiles and creates the same output, except it does so slower. This is also why you can use it in portable code (unlike #pragma once)

MSalters