[英]Write a program that will print “C” if compiled as an (ANSI) C program, and “C++” if compiled as a C++ program
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
和自動生成的默認構造函數#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
聲明#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");
}
}
//
評論這不適用於 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
編譯器宏。
一個字, __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.