C ++プログラムとしてコンパイルされた場合(ANSI)Cプログラムとしてコンパイルされた場合、「C」を印刷するプログラム、および「C ++を」書きます

StackOverflow https://stackoverflow.com/questions/2038200

  •  19-09-2019
  •  | 
  •  

質問

http://www.ocf.berkeley.edu/~から撮影WWU /なぞなぞ/ cs.shtmlする

これは、私には、特定の非常にコンパイラに見えます。探すためにどこか分からないのですか?

役に立ちましたか?

解決

十分なシンプルます。

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

または公式の標準ずにこれを実行する必要がありますか?

他のヒント

私たちは、学校で同様の割り当てをしなければなりませんでした。私たちは(もちろん#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");
}

私は7つのアプローチを知ってます:

1。虐待C ++自動typedefs

(構造体は、それが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同値、自動typedefs、および自動生成されるデフォルトのコンストラクタ

/* Global*/
int isC = 0;
void Foo() { isC = 1; }

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

3。 Cでの虐待にネストstruct宣言

また、シンボルは、内側と外側の構造体の衝突見ます、C ++ 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の違い

は、いくつかの仮定のプラットフォームは、ケースsizeof(char)sizeof(int)と同じであってもよいした8ビット以上でバイトを使用する可能性がありますので、これはポータブルであることが保証されないことに留意されたいです。 (またhref="https://stackoverflow.com/questions/3860943/can-sizeofint-ever-be-1-on-a-hosted-implementation">ははsizeofことができます

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

7。 CおよびC ++の文法は、三項演算子

を解析する方法で、虐待の違い

この1は、厳密に法的ではありませんが、いくつかのコンパイラは緩いです。

int isCPP = 1;
printf("%s\n", (1 ? isCPP : isCPP = 0) ? "C++" : "C");

(あなたはまた、__cplusplusプリプロセッサマクロ(または他のさまざまなマクロ)をチェックすることもできますが、私はそれが問題の精神に従わないと思います。)

私はこれらのすべてのための実装を持っています: http://www.taenarum.com/csua/

の楽しみと-C / C-または-cpp.c
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帰属
所属していません StackOverflow
scroll top