C和c++有很多不同之处,并不是所有有效的C代码都是有效的c++代码。 (这里的“有效”指的是具有定义行为的标准代码,即不是特定于实现的/未定义的/等等。)

在哪种情况下,一段在C和c++中都有效的代码在使用每种语言的标准编译器编译时会产生不同的行为?

为了做一个合理/有用的比较(我试图学习一些实际有用的东西,而不是试图在问题中找到明显的漏洞),让我们假设:

与预处理器无关(这意味着没有使用#ifdef __cplusplus、pragmas等进行hack) 在这两种语言中,任何实现定义都是相同的(例如数字限制等)。 我们比较每个标准的最新版本(例如,c++ 98和C90或更高版本) 如果版本很重要,那么请说明每个版本会产生不同的行为。


当前回答

不要忘记C和c++全局名称空间之间的区别。假设你有一个foo。cpp

#include <cstdio>

void foo(int r)
{
  printf("I am C++\n");
}

和foo2.c

#include <stdio.h>

void foo(int r)
{
  printf("I am C\n");
}

现在假设你有一个main.c和main.cpp,它们看起来都是这样的:

extern void foo(int);

int main(void)
{
  foo(1);
  return 0;
}

当编译为c++时,它将使用c++全局命名空间中的符号;在C中,它将使用C:

$ diff main.cpp main.c
$ gcc -o test main.cpp foo.cpp foo2.c
$ ./test 
I am C++
$ gcc -o test main.c foo.cpp foo2.c
$ ./test 
I am C

其他回答

一个依赖于C编译器的老栗子,不识别c++的行尾注释……

...
int a = 4 //* */ 2
        +2;
printf("%i\n",a);
...
#include <stdio.h>

int main(void)
{
    printf("%d\n", (int)sizeof('a'));
    return 0;
}

在C语言中,这将打印当前系统中sizeof(int)的值,在目前使用的大多数系统中,这通常是4。

在c++中,这必须打印1。

C90 vs. c++ 11 (int vs. double)

#include <stdio.h>

int main()
{
  auto j = 1.5;
  printf("%d", (int)sizeof(j));
  return 0;
}

在C语言中,auto表示局部变量。在C90中,可以省略变量或函数类型。它默认为int。在c++ 11中,auto的意思完全不同,它告诉编译器从用于初始化变量的值推断变量的类型。

另一个sizeof陷阱:布尔表达式。

#include <stdio.h>
int main() {
    printf("%d\n", (int)sizeof !0);
}

它在C中等于sizeof(int),因为表达式是int类型,但在c++中通常是1(尽管它不是必需的)。实际上,它们几乎总是不同的。

c++标准中列出的另一个:

#include <stdio.h>

int x[1];
int main(void) {
    struct x { int a[2]; };
    /* size of the array in C */
    /* size of the struct in C++ */
    printf("%d\n", (int)sizeof(x)); 
}