KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q126717: PRB: C1853 Error Generated by Mixing C and C++ Files

Article: Q126717
Product(s): Microsoft C Compiler
Version(s): 2.0,2.1,4.0,5.0,6.0
Operating System(s): 
Keyword(s): kberrmsg kbCompiler kbCPPonly kbVC kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Last Modified: 25-JUL-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- The C/C++ Compiler (CL.EXE), included with:
   - Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1, 4.0 
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0 
   - Microsoft Visual C++, 32-bit Professional Edition, version 5.0 
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 6.0 
   - Microsoft Visual C++, 32-bit Professional Edition, version 6.0 
   - Microsoft Visual C++, 32-bit Learning Edition, version 6.0 
-------------------------------------------------------------------------------

SYMPTOMS
========

When you build Visual C++ projects that include both C and C++ files and that
use precompiled headers, you may receive the following error message:

  fatal error C1853: '<filename>' is not a precompiled header file
  created with this compiler

CAUSE
=====

The compiler attempts to use a precompiled header generated by a C++ compiler on
a C source file. This can happen when "Per-File Use of Precompiled Headers" is
used with both C and C++ source code in a project.

It is not valid to use a C++ compiler created precompiled header with a source
file that is to be compiled by the C compiler. Nor is it valid to use a C
compiler created precompiled header with a source file that is to be compiled by
the C++ compiler.

The Visual C++ version 2.x error message help for C1853 may be misleading. It
implies that the problem occurs only when mixing .PCH files generated with the
16-bit and 32-bit compilers. Frequently, however, this can occur when building a
project after adding a C source file to a pure C++ project that uses the
"Per-File Use of Precompiled Headers." (The Visual C++ version 4.0 online help
correctly incorporates this information by stating that fatal error C1853 "can
be caused by using a precompiled C++ file with C code.")

RESOLUTION
==========

This problem can be resolved in several ways depending on the situation:

Resolution I
------------

For projects with a single C source file and multiple C++ source files (or
vice-versa), use the following steps to disable precompiled headers for the
single source file:

1. For the current target, open the Project Settings dialog box and select the
  Precompiled Headers section under the C/C++ Tab.

2. Select the C file from the project tree in the left pane.

3. For Visual C++ version 2.x, disable the Use .PCH File checkbox in the
  Per-File Use of Precompiled Headers. For Visual C++ version 4.0, 5.0, and
  6.0, select the Not using precompiled headers option button.

4. Save the new settings and build the project.

Resolution II
-------------

For projects with multiple C and C++ source files, use the following steps to
disable precompiled headers for a set of source files procedure:

With Visual C++ version 2.x:

1. For the current target, create a New Group by choosing New Group from the
  Project menu item.

2. Move the C source files into the new group.

3. Open the Project Settings and select the Precompiled Headers section under
  the C/C++ tab dialog.

4. Select the new group from the project tree in the left pane.

5. Disable the Use .PCH File checkbox in the Per-File Use of Precompiled
  Headers.

6. Save the new settings and build the project.

This will disable precompiled headers for a set of source files. However, source
files in subsequent additions to this group may need the PCH usage disabled
depending on the file's previous settings.

With Visual C++ version 4.0, groups are no longer supported. To disable the use
of precompiled headers for a group of source files, follow the the steps of
Resolution I, but in step 2 hold down the CRTL key while selecting each file.

Resolution III
--------------

For projects not requiring precompiled headers, follow the steps of Resolution I,
but in step 2 select all targets from the project tree in the left pane.

Resolution IV (VC 4.x and 5.0)
------------------------------

1. Create a subproject of type "Static Library".

2. Insert the .C files into this subproject.

3. Delete the .C files from the top-level project.

4. Add the resulting library or .obj files to the link line for the top-level
  project.

This will allow you to specify a pre-compiled header for the top-level project
(.CPP files), and a different pre-compiled header for the subproject (.C files).

STATUS
======

This behavior is by design.

MORE INFORMATION
================

Visual C++ version 2.0 allows only one precompiled header file per target in a
project. This file is named PROJNAME.PCH by default where PROJNAME is the name
of the project. This can be changed in the Project Options edit control of the
target settings using the /Fp option (for example, "/Fp MYNAME.PCH").

This precompiled header (.PCH) file can be generated using either the Automatic
or Per-File Use system as shown in the Precompiled Headers section of the C/C++
tab dialog project settings.

The Automatic PCH option (/YX option) generates a .PCH file when the current .PCH
file is invalid or when the header file is updated. Invalid .PCH files include
those generated by another compiler (C or C++) or those that contain a different
set of header files from the set found in the source. This option optimally
saves compilation time if all source files that use this option contain an
identical set of header files and are of one type (C or C++), or if only one
file in the project is usually built.

The efficiency of this option can depend on compilation order. Interleaving C and
C++ source files in the compilation order always regenerates a new .PCH file.
Building a project after updating a C file when the last build resulted in a C++
.PCH file, regenerates the .PCH file.

The Per-File Use PCH option generates a .PCH file whenever a source file with the
'Create .PCH File' (/Yc option) checkbox enabled is compiled. The generated .PCH
file is used with all source files that have the 'Use .PCH File' (/Yu option)
checkbox enabled. The compiler doesn't regenerate a new .PCH file if the
generated one is invalid; instead, it gives one of the following two messages:

- If the PCH was generated by the C++ compiler:

  fatal error C1853: '<filename>' is not a precompiled header file
  created with this compiler

- If the PCH was generated by a source code containing a different set of
  includes:

  fatal error C1852: '<filename>' is not a valid precompiled header file

NOTE: It is possible to specify more than one source to create a .PCH file,
however Microsoft does not recommend it. Nor does Microsoft recommend that you
mix the two PCH systems because mixing the two can result in the errors outlined
above.

Previous versions of Visual C++ (1.51, 1.50, and 1.1) allowed a separate
precompiled header file for C and C++ source files. Because Visual C++ version
2.0 is limited to only one PCH, it is not possible to use different precompiled
header files for C and C++ files. Porting such a project over will result in the
following message when attempting to build the project:

  The source files "file1.c" and "file2.cpp" are both configured to
  produce the output file "proj.pch". The project cannot be built.

REFERENCES
==========

For more information on precompiled headers, please search on "Precompiled
Headers" in Books Online.

Additional query words: 9.00

======================================================================
Keywords          : kberrmsg kbCompiler kbCPPonly kbVC kbVC200 kbVC210 kbVC400 kbVC500 kbVC600 
Technology        : kbVCsearch kbAudDeveloper kbCVCComp
Version           : :2.0,2.1,4.0,5.0,6.0
Issue type        : kbprb

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.