Xol*_*lve 16 c c++ compiler-specific
取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
它看起来非常适合我的编译器.不知道在哪找?
ava*_*kar 43
我们不得不在学校做类似的任务.我们不允许使用预处理器(#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");
}
Run Code Online (Sandbox Code Playgroud)
jam*_*lin 42
我知道7种方法:
typedefs(注意,struct需要在内部作用域中声明,以便它优先于C++中的外部名称.)
char x;
{
struct x { char dummy[2]; };
printf("%s\n", sizeof (x) == 1 ? "C" : "C++");
}
Run Code Online (Sandbox Code Playgroud)
类似的版本,不依赖之间的模糊性sizeof (type)和sizeof (variable)仅使用类型:
typedef char t;
{
struct t { char dummy[2]; };
printf("%s\n", sizeof (t) == 1 ? "C" : "C++");
}
Run Code Online (Sandbox Code Playgroud)
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++");
Run Code Online (Sandbox Code Playgroud)
structC语言中的嵌套声明typedef struct inner { int dummy; } t;
{
struct outer { struct inner { t dummy[2]; } dummy; };
printf("%s\n",
sizeof (struct inner) == sizeof (t)
? "C++"
: "C");
}
Run Code Online (Sandbox Code Playgroud)
//评论这不适用于C99或支持//扩展的C89编译器.
printf("%s\n",
0 //* */
+1
? "C++"
: "C");
Run Code Online (Sandbox Code Playgroud)
或者:
printf("s\n",
1 //* */ 2
? "C++"
: "C");
Run Code Online (Sandbox Code Playgroud)
sizeof与char文字的差异请注意,这不能保证是可移植的,因为某些假设平台可能使用超过8位的字节,在这种情况下sizeof(char)可能与之相同sizeof(int).(另请参阅Can sizeof(int)在托管实现上是否为1?)
printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
Run Code Online (Sandbox Code Playgroud)
这基于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++");
Run Code Online (Sandbox Code Playgroud)
这个并不严格合法,但有些编译器不严格.
int isCPP = 1;
printf("%s\n", (1 ? isCPP : isCPP = 0) ? "C++" : "C");
Run Code Online (Sandbox Code Playgroud)
(您也可以检查__cplusplus预处理器宏(或其他各种宏),但我认为这不符合问题的精神.)
我在以下所有方面都有实现:http: //www.taenarum.com/csua/fun-with-c/c-or-cpp.c
bma*_*ies 30
很简单.
#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者是否要求在没有官方标准的情况下这样做?
Mat*_*ery 15
puts(sizeof('a') == sizeof(int) ? "C" : "C++");
Run Code Online (Sandbox Code Playgroud)