取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
它看起来非常适合我的编译器。不知道去哪里找?
取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
它看起来非常适合我的编译器。不知道去哪里找?
typedef
s(请注意,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++");
}
}
struct
/class
等价,自动typedef
s,自动生成的默认构造函数#include <stdio.h>
int isC = 0;
void Foo() { isC = 1; }
int main(void)
{
struct Foo { int dummy; };
Foo();
printf("%s\n", isC ? "C" : "C++");
}
struct
声明#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");
}
}
//
评论这不适用于 C99 或支持//
作为扩展的 C89 编译器。
#include <stdio.h>
int main(void)
{
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 hosting implementation?)
#include <stdio.h>
int main(void)
{
printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
}
这是基于 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++");
}
这不是严格合法的,但有些编译器是松懈的。
#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
我们不得不在学校做类似的作业。我们不允许使用预处理器(#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");
}
很简单。
#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}
或者在没有官方标准的情况下是否需要这样做?
puts(sizeof('a') == sizeof(int) ? "C" : "C++");
这是程序:
#include <stdio.h>
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++");
您可以尝试预处理器指令,但这可能不是他们想要的。