簡體   English   中英

編寫一個程序,如果編譯為 (ANSI) C 程序,將打印“C”,如果編譯為 C++ 程序,將打印“C++”

[英]Write a program that will print “C” if compiled as an (ANSI) C program, and “C++” if compiled as a C++ program

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

它看起來非常適合我的編譯器。 不知道去哪里找?

1. 濫用 C++ 自動typedef

(請注意,該struct需要在內部作用域中聲明,以便在 C++ 中優先於外部名稱。)

#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++");
    }
}

2. 濫用 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++");
}

3. 濫用 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");
    }
}

4. 濫用//評論

這不適用於 C99 或支持//作為擴展的 C89 編譯器。

#include <stdio.h>

int main(void)
{
    printf("%s\n",
           0 //* */
           +1
           ? "C++"
           : "C");
}

或者:

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

5. sizeofchar文字的差異

請注意,這不能保證是可移植的,因為某些假設平台可能使用超過 8 位的字節,在這種情況下sizeof(char)可能與sizeof(int)相同。 (另請參閱在托管實現中 sizeof(int) 是否可以為 1?

#include <stdio.h>

int main(void)
{
    printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
}

6. 濫用 lvalue⇒rvalue 轉換時的差異

這是基於 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++");
}

7. 濫用 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++");

您可以嘗試預處理器指令,但這可能不是他們想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM