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

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

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

很简单。

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

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

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

 #include  typedef int X; int main() { struct X { int ch[2]; }; if (sizeof(X) != sizeof(struct X)) printf("C\n"); else printf("C++\n"); } 

我知道7种方法:

1.滥用C ++自动typedef

(注意,struct需要在内部作用域中声明,以便它优先于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声明

另请参阅内部和外部结构的符号冲突,C ++与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.与char文字的差异sizeof

请注意,这不能保证是可移植的,因为某些假设平台可能使用超过8位的字节,在这种情况下, sizeof(char)可能与sizeof(int)相同。 (另请参阅Can sizeof(int)在托管实现上是否为1? )

 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预处理器宏(或其他各种宏),但我认为这不符合问题的精神。)

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

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

这是程序:

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

这里有一些关于C和C ++差异的好读物。

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

一句话, __cplusplus

我猜的意图是编写一些依赖于语言本身之间差异的东西,而不仅仅是预定义的宏。 虽然技术上并不能绝对保证工作,但这样的事情可能更接近于你想要的东西:

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

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

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

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