http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtmlから取得
それは私に特有の非常にコンパイラに見えます。どこを探せばいいのかわからない?
http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtmlから取得
それは私に特有の非常にコンパイラに見えます。どこを探せばいいのかわからない?
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++");
}
}
struct
/class
同等性、自動typedef
s、および自動生成されたデフォルトコンストラクターを悪用する#include <stdio.h>
int isC = 0;
void Foo() { isC = 1; }
int main(void)
{
struct Foo { int dummy; };
Foo();
printf("%s\n", isC ? "C" : "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");
sizeof
との違いchar
一部の架空のプラットフォームが8ビットを超えるバイトを使用する可能性があるため、これが移植可能であるとは限らないことに注意してください。この場合、はとsizeof(char)
同じになる可能性がありますsizeof(int)
。(ホストされた実装でsizeof(int)を1にすることもできますか?)も参照してください。
#include <stdio.h>
int main(void)
{
printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
}
これは、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++");
}
これは厳密には合法ではありませんが、一部のコンパイラは緩いです。
#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
コンパイラ マクロが定義されているかどうかを確認してください。
意図は、定義済みのマクロだけでなく、言語自体の違いに依存するものを書くことだと思います。技術的には動作が完全に保証されているわけではありませんが、おそらく次のようなものが望ましいものに近いでしょう:
int main() {
char *names[] = { "C", "C++"};
printf("%s\n", names[sizeof(char)==sizeof('C')]);
return 0;
}
一言、__cplusplus
。
それだけの価値があるので、別の答えを次に示します。
char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");
プリプロセッサ ディレクティブを試すこともできますが、それは探しているものではない可能性があります。