有什么我可以在C中做,但我不能用C++做?

yus*_*suf 12 c c++

有什么我可以在C中做,但我不能用C++做?我在样本面试问题网站上偶然发现了这个问题......

Sjo*_*erd 43

声明一个名为'class'的变量,如:

int class = 0;
Run Code Online (Sandbox Code Playgroud)

  • 这一个让我微笑. (4认同)
  • 确保没有人在"C++"编译器上编译代码的最佳方法之一:D (4认同)
  • @Luther:真的pp是语言规范的一部分.然而,如果你使用类似`#define class blah`和上面的声明,那么你的变量是*not*命名为`class`.它被命名为"blah",因为标准中的所有内容,包括事物的名称,都在讨论宏替换后会发生什么.尝试外部连接的东西...... (2认同)
  • @Sjoerd:_包含标头的翻译单元不应包含任何定义在该标头中声明或定义的名称的宏。这样的翻译单元也不应为词法上与 keywords_ 相同的名称定义宏(C++03 §17.4.3.1.1)。请注意,这里的“标头”特指“标准库标头”。 (2认同)

wil*_*ilx 20

...这是我可以用C做的,但不能用C++做.

这两种语言都是图灵完备的,因此从理论上讲,您可以在两者中编写同等功能的应用程序.

OTOH,C++不是C的超集.特别是C99具有C++没有的一些功能.例如指定的初始值设定项,结构中的可变长度数组和自动变量.根据你的"任何东西",这可能是C++不能做但C可以做的事情.

  • http://david.tribble.com/text/cdiffs.htm显示了很多差异的例子. (4认同)
  • 如果可能的话,请你给出任何用C而不是C++运行的简单程序 (2认同)

Joh*_*itb 16

在C中,您可以创建数组文字("复合文字"),但在C++中则不能

/* p points to the first element of an array of 4 int */
int *p = (int[]){1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个在编译时尚未知的大小的数组,但C++没有这种可能性("可变长度数组"):

// create array. size is known at runtime only.
int p[rand() % 5 + 1];
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 10

int new = 0;
Run Code Online (Sandbox Code Playgroud)

在C中工作,但显然无法在C++中工作,因为"new"是一个保留字.

还有其他一些带有保留字的"技巧",但除此之外,你几乎可以用C语言做C中的所有事情.


fiz*_*zer 7

C++缺少C99的restrict限定符.因此,没有办法告诉编译器基于知道指针不是别名来执行优化.


Chr*_*isW 6

你可以在C语言中一些你不能用C++编写的东西(因为C++有更严格的语法检查,而C有更广泛的'遗留'语法).

此外,可能有一些运行时环境(O/S +库+编译器),它支持C而不是C++,这样你就可以在这些平台上,你不能做C++℃.


小智 6

相当多的事情.例如,在C中,您可以编写如下代码:

void * v = 0;
char * p = v;
Run Code Online (Sandbox Code Playgroud)

你可以创建这样的数组:

int main() {
    int n = 42;
    int a[n];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它们都不会在C++下编译.

  • C99就是C. (15认同)
  • 在最后一个例子中,我认为你可能需要C99(或gcc). (2认同)

Bil*_*ard 5

从语法上讲,你可以在C中编写一些不能用C++编译的东西(参见ISO C和ISO C++之间的不兼容性,以获得难以理解的细节).如果你要求更高级别,如果有一些程序可以用C语言编写,但不能用C++编写,那么答案就是"不".


小智 5

其实我能想到一个例子:

当您创建要由其他应用程序共享的库(.lib 文件或 .dll 文件)时,最好使用 C 而不是 C++,因为结果更可移植。不过,您可以通过使用“extern“C””块在 C++ 编译器中执行此操作。

具体来说,C++ 有一个怪癖,即没有名称修改的标准约定 - 将库的函数签名转换为编译器使用的更低级别的名称。因此,例如,如果您有一个像“int addNumbers (int a, int b)”这样的函数,不同的 C++ 编译器可能会将此函数翻译为不同的名称,这可能会在您想要导入库时导致问题。如果您使用 C 编译器或用 C 块包围您的库导入和导出代码,则您不会看到此问题,因为只有一种方法可以修改 C 中的函数名称。

  • 实际上,C 并没有指定标准的 ABI。 (2认同)
  • C 没有指定任何 ABI,但足够简单,以至于每个人都同意使用相同的 ABI。与C++不同。 (2认同)