代码之家  ›  专栏  ›  技术社区  ›  Xolve

编写一个程序,将打印“C”如果编译为(ANSI)C程序,和“C++”如果编译为C++程序

  •  15
  • Xolve  · 技术社区  · 16 年前

    取自 http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml

    它看起来非常编译器特定于我。不知道在哪里找?

    10 回复  |  直到 14 年前
        1
  •  30
  •   bmargulies    16 年前

    足够简单。

    #include <stdio.h>
    int main(int argc, char ** argv) {
    #ifdef __cplusplus
    printf("C++\n");
    #else
    printf("C\n");
    #endif
    return 0;
    }
    

    或者在没有官方标准的情况下需要这样做?

        2
  •  41
  •   avakar    16 年前

    我们不得不在学校做类似的作业。我们不允许使用预处理器(除了 #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");
    }
    
        3
  •  40
  •   Community Mohan Dere    9 年前

    我知道7种方法:

    1。滥用C++ 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++");
    }
    

    2。滥用C++ struct / class 等效,自动 类型定义 和自动生成的默认构造函数

    /* Global*/
    int isC = 0;
    void Foo() { isC = 1; }
    
    /* In some function */
    struct Foo { int dummy; };
    Foo();
    printf("%s\n", isC ? "C" : "C++");
    

    三。滥用嵌套 结构 C中的声明

    也看到 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");
    }
    

    4。滥用 // 评论

    这不适用于C99或支持的C89编译器 / / 作为扩展。

    printf("%s\n",
           0 //* */
           +1
           ? "C++"
           : "C");
    

    或者:

    printf("s\n",
           1 //* */ 2
           ? "C++"
           : "C");
    

    5。 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");
    

    6。在执行lvalue⇒rvalue转换时的滥用差异

    这是基于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++");
    

    第七章。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

        4
  •  15
  •   Matthew Slattery    16 年前
    puts(sizeof('a') == sizeof(int) ? "C" : "C++");
    
        5
  •  3
  •   Dmitry    16 年前

    程序如下:

    #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++差异的很好的读法。

        6
  •  2
  •   Ignacio Vazquez-Abrams    16 年前

    只是看看 __STDC__ __cplusplus 编译器宏已定义。

        7
  •  1
  •   kennytm    16 年前

    一个字, __cplusplus .

        8
  •  1
  •   Jerry Coffin    16 年前

    我猜其目的是写一些依赖于语言本身差异的东西,而不仅仅是预定义的宏。虽然从技术上讲,它并不能绝对保证工作,但类似这样的事情可能更接近于所期望的:

    int main() { 
        char *names[] = { "C", "C++"};
    
        printf("%s\n", names[sizeof(char)==sizeof('C')]);
        return 0;
    }
    
        9
  •  0
  •   R.. GitHub STOP HELPING ICE    15 年前

    对于它的价值,这里还有另一个答案:

    char x[sizeof(char *)+2], y[1];
    printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");
    
        10
  •  -1
  •   zmbush    16 年前

    您可以尝试预处理器指令,但这可能不是它们要找的。

    推荐文章