Microsoft KB Archive/85498

= PRB: /Tp and /Tc Show Unexpected Behavior with Wildcards =

Article ID: 85498

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 5.0 Standard Edition

-



This article was previously published under Q85498





SYMPTOMS
When compiling multiple .CPP or .CXX files using a wildcard syntax and the /Tc command line option, for example   cl /Tc *.cpp the C compiler is invoked only for the first source file matching the wildcard specification. For all subsequent files, the C++ compiler is invoked. The inverse is also true. That is, when compiling multiple .C files using a wildcard syntax and the /Tp command line option, the C++ compiler is invoked only for the first file; for all subsequent files, the C compiler is invoked.



CAUSE
This behavior is by design. As stated in the online and hard copy documentation for Microsoft C/C++ version 7.0 and all versions of Microsoft Visual C++ 16- and 32-bit Editions, the following is the correct syntax for the /Tc and /Tp command line options: /Tc  -or-   /Tc /Tp  -or-   /Tp Each option refers to only one source file. Therefore, the first file matching the wildcard specification will be compiled as directed by the corresponding /T? option. All other files matching the wildcard will be compiled in accordance with their extension. (The C compiler is invoked for .C files, the C++ compiler for .CPP or .CXX files.)



MORE INFORMATION
The following are two possible workarounds for the potential inconvenience presented by this behavior:  Use a makefile to control compilations involving the /Tc or /Tp switch. Instead of using wildcards, list the files as dependents of the respective .OBJ files. This offers two advantages over using wildcards:

 Only the files that have changed with respect to their .OBJ are recompiled. The proper compiler is invoked for the file to be compiled.

-or-

 Rename all files in question such that they have the expected extensions. For example, rename SRC.CPP to SRC.C if you want the C compiler to be invoked on the source.</li></ul>

The sample code below is a makefile that could be used to replace the wildcard command-line compilation:

Sample Code
If you wish to compile file1.c, file2.c and file3.c with the C++ compiler and link them to create exefile.exe, use the following makefile: .c.obj: cl /c /Tp $<

exefile.exe : file1.obj file2.obj file3.obj link $**, exefile.exe;

Additional query words: 8.00 8.00c 9.00

Keywords: kbprb kbcompiler KB85498

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.