【问题标题】:Different output for different compiler - C and C++ [duplicate]不同编译器的不同输出 - C 和 C++ [重复]
【发布时间】:2011-07-24 23:10:45
【问题描述】:

你能想到“一个程序”,它为“C 和 C++ 编译器提供不同的输出”(但在同一语言下提供一致的输出)?

【问题讨论】:

  • 这是一个愚蠢的面试问题

标签: c++ c compilation


【解决方案1】:

来自wikipedia,经过修改以在每种语言中产生一致的输出:

extern int T;

int size(void)
{
    struct T {  int i;  int j;  };

    return sizeof(T) == sizeof(int);
    /* C:   return 1
    *  C++: return 0
    */
}

【讨论】:

  • 这会根据语言返回不同的状态,但不会产生任何输出
【解决方案2】:
#include <stdio.h>
int main(void)
{
#ifdef __cplusplus
    puts("C++");
#else
    puts("C");
#endif
    return 0;
}

【讨论】:

  • 预处理器是语言的一部分?
  • @harper:是的。它是 C99 标准的第 6.10 节,C++ 标准的第 16 节。
【解决方案3】:

此程序在 C++ 或 C99 中生成 12,在 C89 中生成 6

#include <stdio.h>

int main()
{
    int a = 12//**/2;
    ;

    printf("%d\n", a);
    return 0;
}

【讨论】:

  • 虽然准确,但我认为它更像是一种 hack :) 不错。
  • 但这并不能真正回答问题,不是吗?它在 C 和 C++ 中产生相同的输出(毕竟 C99 是当前的 C 标准)。
  • @KeithThompson:是的,ecik's answer 更准确地匹配了这个问题。
【解决方案4】:
typedef char X;
int main() {
    struct X { double foo; }
    printf("%d\n", sizeof(X));
    return 0;
}

【讨论】:

  • 缺少#include &lt;stdio.h&gt;"%d" 需要 int,而不是 size_t。符合要求的实现可以有sizeof (struct X) == 1(例如CHAR_BIT == 64),可以通过给struct X 两个char 成员而不是double 来修复。
【解决方案5】:

Incompatibilities between ISO C and ISO C++

一个常见的例子是sizeof('A'),它在 C 中通常是 4,但在 C++ 中总是 1,因为像 'A' 这样的字符常量在 C 中的类型为 int,而在 C++ 中的类型为 char

#include <stdio.h>

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

【讨论】:

【解决方案6】:
int main() { return sizeof 'a'; }

【讨论】:

  • 但不是完全便携。如果sizeof (int) == 1sizeof 'a' 在 C 中可能是 1(只有在 CHAR_BIT &gt;= 16 时才有可能)。
【解决方案7】:
int class;

不会在 C++ 中编译,而是在 C 中编译。

【讨论】:

  • 哇!!许多想法都集中在一个地方......很好......
  • 问题是关于程序输出,而不是编译器输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多