17

http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtmlから取得

それは私に特有の非常にコンパイラに見えます。どこを探せばいいのかわからない?

4

10 に答える 10

49

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同等性、自動typedefs、および自動生成されたデフォルトコンストラクターを悪用する

#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.リテラルsizeofとの違いchar

一部の架空のプラットフォームが8ビットを超えるバイトを使用する可能性があるため、これが移植可能であるとは限らないことに注意してください。この場合、はとsizeof(char)同じになる可能性がありますsizeof(int)(ホストされた実装でsizeof(int)を1にすることもできますか?)も参照してください。

#include <stdio.h>

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

6.左辺値⇒右辺値変換が実行されるときの乱用の違い

これは、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

于 2010-01-10T19:46:00.083 に答える
44

学校でも同様の課題をしなければなりませんでした。プリプロセッサの使用は許可されていませんでした (#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");
}
于 2010-01-10T19:25:29.540 に答える
31

十分に単純です。

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

または、公式の標準なしでこれを行う必要がありますか?

于 2010-01-10T19:17:06.233 に答える
16
puts(sizeof('a') == sizeof(int) ? "C" : "C++");
于 2010-01-10T19:25:31.293 に答える
3

プログラムは次のとおりです。

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("This is %s\n", sizeof 'a' == sizeof(char) ? "C++" : "C");
    return 0;
}

そして、C と C++ の違いに関するいくつかの素晴らしい読み物があります

于 2010-01-10T19:56:15.087 に答える
2

__STDC__および__cplusplusコンパイラ マクロが定義されているかどうかを確認してください。

于 2010-01-10T19:16:58.253 に答える
1

意図は、定義済みのマクロだけでなく、言語自体の違いに依存するものを書くことだと思います。技術的には動作が完全に保証されているわけではありませんが、おそらく次のようなものが望ましいものに近いでしょう:

int main() { 
    char *names[] = { "C", "C++"};

    printf("%s\n", names[sizeof(char)==sizeof('C')]);
    return 0;
}
于 2010-01-10T19:27:41.547 に答える
1

一言、__cplusplus

于 2010-01-10T19:16:20.423 に答える
0

それだけの価値があるので、別の答えを次に示します。

char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");
于 2011-06-25T15:35:28.513 に答える
-1

プリプロセッサ ディレクティブを試すこともできますが、それは探しているものではない可能性があります。

于 2010-01-10T19:16:44.930 に答える