编写一个程序,如果编译为(ANSI)C程序将打印“C”,如果编译为C ++程序则编写“C ++”

时间:2010-01-10 19:14:33

标签: c++ c compiler-specific

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

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

10 个答案:

答案 0 :(得分:41)

我们必须在学校做类似的任务。我们不允许使用预处理器(当然除了#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");
}

答案 1 :(得分:40)

我知道7种方法:

1。滥用C ++自动typedef s

(请注意,结构需要在内部作用域中声明,以便它优先于C ++中的外部名称。)

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

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

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

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

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

/* In some function */
struct Foo { int dummy; };
Foo();
printf("%s\n", isC ? "C" : "C++");

3。滥用C

中的嵌套struct声明

另见Symbol clashing of inner and outer structs, C++ vs C

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编译器。

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

或者:

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

5。与sizeof文字

char差异

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

printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");

6。执行左值⇒价值转换时的滥用差异

这基于ISO C ++ 03标准中的5.16,5.17,5.18示例,它在gcc中工作但在MSVC中不起作用(可能是由于编译器错误?)。

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

7。滥用C和C ++的语法解析三元运算符

的方式不同

这个并不严格合法,但有些编制者不严格。

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

答案 2 :(得分:30)

足够简单。

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

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

答案 3 :(得分:15)

puts(sizeof('a') == sizeof(int) ? "C" : "C++");

答案 4 :(得分:3)

以下是该计划:

#include <stdio.h>

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

here是关于C和C ++差异的一个很好的解读。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

一个字,__cplusplus

答案 7 :(得分:1)

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

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

    printf("%s\n", names[sizeof(char)==sizeof('C')]);
    return 0;
}

答案 8 :(得分:0)

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

char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");

答案 9 :(得分:-1)

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