C++一般被认为是C的超集合(Superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。 最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。下列是有效的C代码:
从void*类型隐式转换为int*类型
int*i=malloc(sizeof(int)*5);
但要使其在C和C++两者皆能运作,就需要使用显式转换:
int*i=(int*)malloc(sizeof(int)*5);
另一个常见的可移植问题是,C++定义了很多的新关键字,如new和,class它们在C程序中,是可以作为识别字(例:变量名)的。
在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。
若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在 extern “C” { /* C代码 */ } 之内。