这似乎与编译器有关,不知道该去哪里找?取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
typedef
(请注意,在C++中,struct
需要在内部作用域中声明,以便优先于外部名称。)
#include <stdio.h>
int main(void)
{
char x;
{
struct x { char dummy[2]; };
printf("%s\n", sizeof (x) == 1 ? "C" : "C++");
}
}
一种不依赖于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
以及自动生成默认构造函数#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
声明也可以参考C++与C中内部和外部结构体的符号冲突
#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 hosted 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");
}
typedef struct X {} Y; void X();
可以编译,但如果添加void Y();
,则会出现编译器错误:在非用户定义的命名空间中已经使用了符号Y
,这是由于typedef
。 - David Rodríguez - dribeas非常简单。
#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}
还是说有没有必要在不使用官方标准的情况下完成这个需求?
__cplusplus
被定义为值199711L
”。(第16.8节:[cpp.predefined]) - stakx - no longer contributing__cplusplus
定义为199711L。例如,gcc仍将__cplusplus
定义为1。 - kennytmputs(sizeof('a') == sizeof(int) ? "C" : "C++");
CHAR_BIT
至少为 16,sizeof(int)
可能为 1。 - avakar以下是程序代码:
#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
是否已定义。
我猜测意图是编写一些依赖于语言本身差异而非预定义宏的内容。虽然从技术上讲不能完全保证其可行性,但像这样的方法可能更接近所需的效果:
int main() {
char *names[] = { "C", "C++"};
printf("%s\n", names[sizeof(char)==sizeof('C')]);
return 0;
}
sizeof(int) == 1
并且所有 int
值都是有效的字符返回值从 getchar()
,在这种情况下 EOF
也可以是一个有效的字符,并且需要使用 feof()
(和使用 ferror()
进行错误测试)来测试 EOF
是否表示文件结束。Cray 就是 sizeof(int) == 1
的一个例子:它们曾经将所有整数类型都设置为 64 位宽度。 - JaakkoK__cplusplus
。说句实话,这里还有一个答案:
char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");
char
是 1 字节,而一个字节至少包含 8 位,但也可能更多。这就是为什么会有CHAR_BIT
的存在。 - jamesdlinstruct
的典型方式是使用类型为struct x
的struct x { ... }
结构体。如果你想要一个typedef
,这样在使用时就不需要每次都输入struct
,你可以这样做:typedef struct x { ... } simpler_name
。请注意,struct
标签(x
)和typedef
(simpler_name
)存在于不同的 C 命名空间中,因此你也可以这样做:typedef struct x { ... } x
。C++ 会隐式地为struct
和class
创建这样的typedef
,因此在 C++ 中,方法 #1 中的x
与 C 中的解析方式不同。 - jamesdlin