This chapter describes how to move programs from C to C++.
C programs generally require little modification to compile as C++ programs. C and C++ are link compatible; you don't have to modify compiled C code to link it with C++ code. See The C++ Programming Language, by Margaret A. Ellis and Bjarne Stroustrup, for more specific information on the C++ language.
Table 6-1 shows all reserved keywords in C++ and C, plus keywords that are predefined by C++. Keywords that are reserved in C++ but not in C are shown in boldface.
Table 6-1 Reserved Keywords
asm |
do |
if |
return |
typedef |
auto |
double |
inline |
short |
typeid |
bool |
dynamic_cast |
int |
signed |
typename |
break |
else |
long |
sizeof |
union |
case |
enum |
mutable |
static |
unsigned |
catch |
explicit |
namespace |
static_cast |
using |
char |
export |
new |
struct |
virtual |
class |
extern |
operator |
switch |
void |
const |
false |
private |
template |
volatile |
const_cast |
float |
protected |
this |
wchar_t |
continue |
for |
public |
throw |
while |
default |
friend |
register |
true |
|
delete |
goto |
reinterpret_cast |
try |
|
_ _STDC_ _ is predefined to the value 0. For example:
#include <stdio.h> main() { #ifdef __STDC__ printf("yes\n"); #else printf("no\n"); #endif #if __STDC__ ==0 printf("yes\n"); #else printf("no\n"); #endif }
yes yes
The following table lists reserved words for alternate representations of certain operators and punctuators specified in the current ANSI/ISO working paper from the ISO C++ Standards Committee. These alternate representations have not yet been implemented in the C++ compiler, but in future releases may be adopted as reserved words and should not be otherwise used.
Table 6-2 Reserved Words for Operators and Punctuators
and |
bitor |
not |
or |
xor |
and_eq |
compl |
not_eq |
or_eq |
xor_eq |
bitand |
|
|
|
|
K&R C, ANSI C, and C++ require different header files. To make C++ header files conform to K&R C and ANSI C standards so that they are generic, use the macro _ _cplusplus to separate C++ code from C code. The macro _ _STDC_ _ is defined in both ANSI C and C++. Use this macro to separate C++ or ANSI C code from K&R C code.
You can insert an #ifdef statement in your code to conditionally compile C++ or C using the C++ compiler. To do this, use the _ _cplusplus macro:
#ifdef __cplusplus extern "C" int myfunc(int); // C++ declaration #else int myfunc(); /* K&R C declaration */ #endif
In the past, this macro was c_plusplus, which is no longer accepted.
The compiler encodes C++ function names to allow overloading. To call a C function, or a C++ function "masquerading" as a C function, you must prevent this encoding. Do so by using the extern "C" declaration. For example:
extern "C" { double sqrt(double); //sqrt(double) has C linkage }
This linkage specification does not affect the semantics of the program using sqrt(), but simply causes the compiler to use the C naming conventions for sqrt().
Only one of a set of overloaded C++ functions can have C linkage. You can use C linkage for C++ functions that you intend to call from a C program, but you would only be able to use one instance of that function.
You cannot specify C linkage inside a function definition. Such declarations can only be done at the global scope.