Запишите программу, которая распечатает “C”, если скомпилировано как (ANSI) C программа и “C++”, если скомпилировано как программа C++

Взятый с http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml

Это смотрит очень компилятор, характерный для меня. Не знайте, где искать?

16
задан Xolve 10 January 2010 в 19:14
поделиться

9 ответов

достаточно просто.

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

Или есть требование сделать это без официального стандарта?

30
ответ дан 30 November 2019 в 15:01
поделиться

Мы должны были выполнить подобное задание в школе. Нам не разрешили использовать препроцессор (за исключением, конечно, #include). В следующем коде используется тот факт, что в языке Си имена типов и названия структур образуют отдельные пространства имен, в то время как в языке Си++ - нет.

#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");
}
43
ответ дан 30 November 2019 в 15:01
поделиться
puts(sizeof('a') == sizeof(int) ? "C" : "C++");
15
ответ дан 30 November 2019 в 15:01
поделиться

Из трассировки стека кажется, что ваши подключения к розетке испортились в вашем основном файле XIB - вы можете начать искать там.

Кроме того, вы не сможете отладить много, потому что нет исходного кода для встроенных механизмов iPhone, которые, похоже, отказывают здесь (скорее всего, из-за того, что вы сделали в дизайнере интерфейсов/XIBs).

-121--3632217-

Можно попробовать директивы препроцессора, но это может быть не то, что они ищут.

-121--2359676-

Проверьте, определены ли макросы компилятора __ STDC __ и __ cplusplus .

2
ответ дан 30 November 2019 в 15:01
поделиться

Вы можете попробовать директивы препроцессора, но это может быть не то, что они ищут.

-1
ответ дан 30 November 2019 в 15:01
поделиться

Одним словом, __ CPLUSPLUS .

1
ответ дан 30 November 2019 в 15:01
поделиться

Вот программа:

#include <stdio.h>

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

и здесь - это немного хорошего чтения на различиях C и C ++.

3
ответ дан 30 November 2019 в 15:01
поделиться

Я предполагаю, что намерение писать то, что зависит от различий между самими языками, а не просто предопределенными макросами. Хотя это технически не совсем гарантированно работать, что-то вроде этого, вероятно, ближе к тому, что нужно:

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

    printf("%s\n", names[sizeof(char)==sizeof('C')]);
    return 0;
}
1
ответ дан 30 November 2019 в 15:01
поделиться

Оригинальная бумага на странице и BRIN ( Google) 1998 описал ползание 25 миллионов страниц на 4 машины за 10 дней. Они открывали 300 соединений одновременно на машину. Я думаю, что это все еще довольно хорошо. В моих собственных экспериментах с помощью шельфа, работающих на Linux, я мог надежно открыть 100-200 одновременных соединений.

Существует три основных вещей, которые вам нужно сделать, пока ползаясь: (1) Выберите, что сканировать следующий, (2) Получите эти страницы, (3) хранить эти страницы. Для (1) Вам необходимо реализовать какую-то приоритетную очередь (то есть, чтобы сделать ширину первого поиска или опихи), вам также нужно отслеживать, где вы были. Это можно сделать с помощью фильтра Bloom. Bloom Фильтры (посмотрите на википедии) также можно использовать для хранения, если страница имела файл Robot.txt, и если префикс данного URL исключен.

(2) Получение страниц является фиксированной стоимостью, и вы не можете многое делать об этом; Однако, как на одной машине, вы ограничены количеством открытых соединений, если у вас есть кабель, вы, вероятно, не найдете близок к употреблению всю доступную ширину полосы. Возможно, вам придется беспокоиться о пропускной способности Caps, хотя.

(3) Хранение страниц, как правило, выполняется в файле веб-архива, такое, что делает интернет-архив. С сжатием вы, вероятно, можете хранить миллиард страниц в 7 терабайтах, поэтому хранилище было бы доступно иметь миллиард страниц. В качестве оценки того, что может сделать одну машину, предположим, что вы получите дешевую машину на 200 долларов с 1 ГБ или ОЗУ и 160 ГБ жесткого бизнеса. На странице 20 кБ (используют запросы на диапазон, чтобы избежать глотания целых страниц), 10 миллионов страниц займет 200 ГБ, но сжатый составляет около 70 ГБ.

Если вы держите архив, что ваша поисковая система выключается (на которой вы уже рассчитали, скажем, страницы RING и BM25), а также активное поле для сканирования, то вы потребляли 140 ГБ. Это оставляет вам около 20 ГБ для других случайных материалов, которые вам нужно обрабатывать. Если вы работаете в памяти, вам нужно попытаться сохранить столько же вашим приоритетной очереди и фильтрами Bloom в оперативной памяти, насколько это возможно, вы также прямо на краю, что это возможно. Если вы ползти 300 000 страниц / день, это заберет вас чуть более месяца / 10 миллионов Page Crawl

-121--2739648-

Я знаю 7 подходов:

1. Злоупотребление C ++ Автоматически Typedef S

(Обратите внимание, что структура должна быть объявлена ​​во внутреннем объеме, так что он имеет приоритет над внешним именем в C ++.)

char x;
{
    struct x { char dummy[2]; };
    printf("%s\n", sizeof (x) == 1 ? "C" : "C++");
}

Аналогичная версия, которая не Положитесь на двусмысленность между SizeOf (тип) и SizeOf (переменная) , используя только типы:

typedef char t;
{
    struct t { char dummy[2]; };
    printf("%s\n", sizeof (t) == 1 ? "C" : "C++");
}

2. ABOUS C ++ struct / Класс Эквивалентность, автоматическая Typedef S и автоматически сгенерированные конструкторы по умолчанию

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

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

3. Злоупотребление вложенное struct Декларации в C

Также см. Также Символ столкновения внутренних и внешних структур, 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");
}

4. Злоупотребление // Комментарии

Это не будет работать с C99 или с компиляторами C89, которые поддерживают // в виде расширения.

printf("%s\n",
       0 //* */
       +1
       ? "C++"
       : "C");

Или альтернативно:

printf("s\n",
       1 //* */ 2
       ? "C++"
       : "C");

5. Различия Различия Различия Литералы Литералы

Обратите внимание, что это не гарантированно будет портативным, поскольку возможно, что некоторая гипотетическая платформа может использовать байты с более чем 8 битами, в этом случае SIZEOF (CHAR) может быть таким же, как SIZEOF (INT) . (Также см. CAN SIZEOF (INT) когда-либо быть 1 в хостированной реализации? )

printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");

6. Различия в злоупотреблениях, когда выполняются преобразования Lvalue⇒

, это основано от примера 5.16, 5.17, 5.18 в стандарте ISO C ++ 03, и он работает в GCC, но не в MSVC (возможно, из-за ошибки компилятора ?).

void* array[2];
printf("%s\n",
       (sizeof (((void) 0), array) / sizeof (void*) == 1)
       ? "C"
       : "C++");

7. Различия в злоупотреблениях на пути грамматики C и C ++ разбирают тройной оператор

. Это не строго законно, но некоторые компиляторы являются слабыми.

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

(Вы также можете проверить для макроса __ CPLUSPLUS __ Cplusplus __ CPLUSPLUS Preprocessor Macro (или различные другие макросы), но я думаю, что это не следит за духом вопроса.)

У меня есть реализации для всех сиденье: http://www.taeenarum.com/csua/fun-with-c/c-or-cpp.c.c

42
ответ дан 30 November 2019 в 15:01
поделиться