Ответ 1
Достаточно просто.
#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}
Или существует ли требование сделать это без официального стандарта?
Взято из http://www.ocf.berkeley.edu/~wwu/riddles/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 имена типов и имена структур образуют отдельные пространства имен, тогда как в С++ они этого не делают.
#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 подходов:
typedef
s(Обратите внимание, что структура должна быть объявлена во внутренней области, чтобы она имела приоритет над внешним именем в С++.)
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++");
}
struct
/class
, автоматического typedef
s и автоматически созданных конструкторов по умолчанию/* Global*/
int isC = 0;
void Foo() { isC = 1; }
/* In some function */
struct Foo { int dummy; };
Foo();
printf("%s\n", isC ? "C" : "C++");
struct
в CТакже см. Сопоставление символа внутренней и внешней структур, С++ vs 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");
}
//
комментариевЭто не будет работать с C99 или компиляторами C89, которые поддерживают //
как расширение.
printf("%s\n",
0 //* */
+1
? "C++"
: "C");
или, альтернативно:
printf("s\n",
1 //* */ 2
? "C++"
: "C");
sizeof
различия с char
литераламиОбратите внимание, что это не гарантируется быть переносимым, поскольку возможно, что какая-то гипотетическая платформа может использовать байты с более чем 8 битами, и в этом случае sizeof(char)
может быть таким же, как sizeof(int)
. (Также см. Может ли sizeof (int) когда-либо быть 1 в размещенной версии?)
printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");
Это основано на примере 5.16, 5.17, 5.18 в стандарте ISO С++ 03 и работает в gcc, но не в MSVC (возможно, из-за ошибки компилятора?).
void* array[2];
printf("%s\n",
(sizeof (((void) 0), array) / sizeof (void*) == 1)
? "C"
: "C++");
Этот не является строго законным, но некоторые компиляторы слабы.
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
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 и С++.
Просто посмотрите, определены ли макросы компилятора __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++");
Вы можете попробовать препроцессорные директивы, но это может быть не то, что они ищут.