取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
它看起来非常适合我的编译器。不知道在哪找?
答案 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种方法:
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++");
}
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++");
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");
}
//
条评论这不适用于C99或支持//
作为扩展名的C89编译器。
printf("%s\n",
0 //* */
+1
? "C++"
: "C");
或者:
printf("s\n",
1 //* */ 2
? "C++"
: "C");
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");
这基于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++");
这个并不严格合法,但有些编制者不严格。
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)
您可以尝试预处理程序指令,但这可能不是他们想要的。