如何编写一个确定其编译器的程序

时间:2014-02-20 19:49:15

标签: c++ c

需要编写C程序。如果它在C语言编译器中运行,程序应该打印“C”。如果它在编译器C ++中运行,它应该打印“C ++”。

不能使用预处理程序指令。

在头部只是为了比较char大小的任何角色的大小,如:

sizeof(char)==sizeof('a')

这是如何运作的:

// C code:
#include <stdio.h>
int main()
{
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C"));
    return 0;
}

输出 C

// C++ code:
#include <stdio.h>
int main()
{
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C"));
    return 0;
}

输出: C ++

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以检查__cplusplus宏以查看您是否正在编译为c ++。

#include <stdio.h>

int main()
{
    printf("%s\n",
#if __cplusplus
            "C++"
#else
            "C"
#endif
          );
}

答案 1 :(得分:2)

标准http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf 包含关于C和C ++之间差异的附录

因此它包含您使用的char vs int差异,但也包含

  

更改:在C ++中,类声明将类名引入范围               它被声明并隐藏任何对象,功能或其他声明               该名称在封闭范围内。               在C中,结构标记名称的内部范围声明永远不会隐藏               外部范围内对象或函数的名称

示例:(来自标准)

int x [99];
void f () {
     struct x { int a ; };
     sizeof (x ); /∗ size of the array in C ∗/
                  /∗ size of the struct in C++ ∗/
}

gcc在我的机器上给了396和g ++ 4