17

取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml

它看起来非常适合我的编译器。不知道去哪里找?

4

10 回答 10

49

1.滥用C++自动typedefs

(请注意,struct需要在内部范围内声明,以便它优先于 C++ 中的外部名称。)

#include <stdio.h>

int main(void)
{
    char x;

    {
        struct x { char dummy[2]; };
        printf("%s\n", sizeof (x) == 1 ? "C" : "C++");
    }
}

一个类似的版本,不依赖于 and 之间的歧义sizeof (type)sizeof (variable)仅使用类型:

#include <stdio.h>

int main(void)
{
    typedef char t;

    {
        struct t { char dummy[2]; };
        printf("%s\n", sizeof (t) == 1 ? "C" : "C++");
    }
}

2.滥用C++ struct/class等价,自动typedefs,自动生成的默认构造函数

#include <stdio.h>

int isC = 0;
void Foo() { isC = 1; }

int main(void)
{
    struct Foo { int dummy; };
    Foo();
    printf("%s\n", isC ? "C" : "C++");
}

3. 在 C 中滥用嵌套struct声明

另请参阅内部和外部结构的符号冲突,C++ vs C

#include <stdio.h>

int main(void)
{
    typedef struct inner { int dummy; } t;

    {
        struct outer { struct inner { t dummy[2]; } dummy; };
        printf("%s\n",
               sizeof (struct inner) == sizeof (t)
               ? "C++"
               : "C");
    }
}

4.滥用//评论

这不适用于 C99 或支持//作为扩展的 C89 编译器。

#include <stdio.h>

int main(void)
{
    printf("%s\n",
           0 //* */
           +1
           ? "C++"
           : "C");
}

或者:

    printf("%s\n",
           1 //* */ 2
           ? "C++"
           : "C");

5.sizeofchar字面的区别

请注意,这不能保证是可移植的,因为某些假设平台可能使用超过 8 位的字节,在这种情况下sizeof(char)可能与sizeof(int). (另见Can sizeof(int) ever be 1 on a hosting implementation?

#include <stdio.h>

int main(void)
{
    printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
}

6. 执行左值⇒右值转换时的滥用差异

这是基于 ISO C++03 标准中的 5.16、5.17、5.18 示例,它在 gcc 中有效,但在 MSVC 中无效(可能是由于编译器错误?)。

#include <stdio.h>

int main(void)
{
    void* array[2];
    printf("%s\n",
           (sizeof (((void) 0), array) / sizeof (void*) == 1)
           ? "C"
           : "C++");
}

7.滥用C和C++语法解析三元运算符的方式差异

这不是严格合法的,但有些编译器是松懈的。

#include <stdio.h>

int main(void)
{
    int isCPP = 1;
    printf("%s\n", (1 ? isCPP : isCPP = 0) ? "C++" : "C");
}

(您也可以检查__cplusplus预处理器宏(或各种其他宏),但我认为这不符合问题的精神。)

我在以下位置有所有这些的实现: http ://www.taenarum.com/csua/fun-with-c/c-or-cpp.c

于 2010-01-10T19:46:00.083 回答
44

我们不得不在学校做类似的作业。我们不允许使用预处理器(#include当然除外)。以下代码使用的事实是,在 C 中,类型名称和结构名称形成单独的名称空间,而在 C++ 中则不然。

#include <stdio.h>
typedef int X;
int main()
{
    struct X { int ch[2]; };
    if (sizeof(X) != sizeof(struct X))
        printf("C\n");
    else
        printf("C++\n");
}
于 2010-01-10T19:25:29.540 回答
31

很简单。

#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}

或者在没有官方标准的情况下是否需要这样做?

于 2010-01-10T19:17:06.233 回答
16
puts(sizeof('a') == sizeof(int) ? "C" : "C++");
于 2010-01-10T19:25:31.293 回答
3

这是程序:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("This is %s\n", sizeof 'a' == sizeof(char) ? "C++" : "C");
    return 0;
}

这里有一些关于 C 和 C++ 差异的不错的读物

于 2010-01-10T19:56:15.087 回答
2

只需查看是否定义了__STDC____cplusplus编译器宏。

于 2010-01-10T19:16:58.253 回答
1

一个字,__cplusplus

于 2010-01-10T19:16:20.423 回答
1

我猜目的是写一些取决于语言本身之间差异的东西,而不仅仅是预定义的宏。虽然它在技术上不能绝对保证工作,但这样的事情可能更接近于期望:

int main() { 
    char *names[] = { "C", "C++"};

    printf("%s\n", names[sizeof(char)==sizeof('C')]);
    return 0;
}
于 2010-01-10T19:27:41.547 回答
0

对于它的价值,这是另一个答案:

char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");
于 2011-06-25T15:35:28.513 回答
-1

您可以尝试预处理器指令,但这可能不是他们想要的。

于 2010-01-10T19:16:44.930 回答