编写一个程序,如果编译为(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++");
您可以尝试预处理器指令,但这可能不是他们想要的。