一段使用 gcc 编译但不使用 g++ 的代码

发布于 2024-10-06 19:45:34 字数 496 浏览 2 评论 0原文

可能的重复:
这是合法的 C++ 代码吗?
“C++ 的 C 子集”->哪里不是?例子?

有人能想出一段用 gcc 或任何其他 C 编译器编译的代码,而不编译 g++ 或任何其他 C++ 编译器吗?

更新: 我的意思不仅仅是关键字

UPDATE2: 谢谢大家的解答。显然,版主对 C 和 C++ 之间的细微差别没有我那么热情。

更新3: 主持人:您能否按照您的建议将其与我之前关于该主题的问题合并?将这两个问题放在一起是非常有意义的。

Possible Duplicates:
Is this a legitimate C++ code?
“C subset of C++” -> Where not ? examples ?

Could anybody come up with a piece of code that compiles with gcc or any other C compiler, and doesn't compile g++ or any other C++ compiler?

UPDATE:
I don't mean just keywords

UPDATE2:
Thank you All for answers. Apparently moderators were less enthusiastic than I was about subtle differences between C and C++.

UPDATE3:
to moderators: could you merge it with my previous question on the topic, as you suggested? It makes perfect sense to keep these two question together.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

我乃一代侩神 2024-10-13 19:45:34
#include <stdlib.h>

int main()
{
    char* s = malloc(128);
    return 0;
}

这将使用 gcc 编译,但不能使用 g++ 编译。 C++ 需要从 void* 进行显式转换,而 C 则不需要。

#include <stdlib.h>

int main()
{
    char* s = malloc(128);
    return 0;
}

This will compile with gcc, but not with g++. C++ requires an explicit cast from void* here, whereas C does not.

故笙诉离歌 2024-10-13 19:45:34
int main(int argc, char **class)
{
    return !argc;
}

编辑:另一个例子

int foo();
int main(void) {
    return foo(42);
}
int foo(int bar) {
    return bar - 42;
}
int main(int argc, char **class)
{
    return !argc;
}

Edit: another example

int foo();
int main(void) {
    return foo(42);
}
int foo(int bar) {
    return bar - 42;
}
予囚 2024-10-13 19:45:34

尝试

extern int getSize();

int main()
{
    char x[getSize()];
    x[0] = 0;
}

int getSize()
{
     return 4;
}

记住使用严格标志进行编译。

> gcc -pedantic -std=c99 t.c
> g++ -pedantic t.c
t.c: In function `int main()':
t.c:6: error: ISO C++ forbids variable length array `x'

Try

extern int getSize();

int main()
{
    char x[getSize()];
    x[0] = 0;
}

int getSize()
{
     return 4;
}

Remember to compile with the strict flags.

> gcc -pedantic -std=c99 t.c
> g++ -pedantic t.c
t.c: In function `int main()':
t.c:6: error: ISO C++ forbids variable length array `x'
煮茶煮酒煮时光 2024-10-13 19:45:34

怎么样

/* Within a function */
{
  enum {foo} bar;
  bar++;
}

这似乎是 C++ 设计中一个相当大的突破性变化,但事实就是如此。

How about

/* Within a function */
{
  enum {foo} bar;
  bar++;
}

That seems a pretty big breaking change in the design of C++, but it is what it is.

彡翼 2024-10-13 19:45:34

字符大小如何:
更糟糕的是它编译但在运行时产生不同的输出。

#include <stdio.h>

int main()
{
    fprintf(stdout, "%s\n", (sizeof('\xFF') == sizeof(char))?"OK":"Fail");
}

> gcc -pedantic t.c
> ./a.exe
Fail
> g++ -pedantic t.c
> ./a.exe
OK

这实际上让我们想知道为什么会这样?

fprintf(stdout, "%c%c\n", 'A', 'B');

即使对象的大小不同,它也适用于两个编译器。

What about character size:
Even worse is that it compiles but produces different output at runtime.

#include <stdio.h>

int main()
{
    fprintf(stdout, "%s\n", (sizeof('\xFF') == sizeof(char))?"OK":"Fail");
}

> gcc -pedantic t.c
> ./a.exe
Fail
> g++ -pedantic t.c
> ./a.exe
OK

This actually makes we wonder why this works?

fprintf(stdout, "%c%c\n", 'A', 'B');

It works on both compilers even though the size of the objects are different.

何时共饮酒 2024-10-13 19:45:34

void* 上的指针算术:

void* t;
t++; // compiles only in gcc

pointer arithmetics on void*:

void* t;
t++; // compiles only in gcc
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文