Создание функции Cout в C? - PullRequest
       29

Создание функции Cout в C?

5 голосов
/ 10 августа 2009

Я предполагаю, что большинство компиляторов C ++ написаны на ассемблере. Что делает их совершенно разными языками (я могу ошибаться). При этом, если бы я собирался создать функцию стиля cout для простого старого C, как бы я это сделал? cout имеет некоторые очень впечатляющие функции, например, этот фрагмент:

// endl not only prints a new line but also flushes the stream
cout << "Hello World!" << endl;

Который, я уверен, переводит это в C:

printf("Hello World!\n");
fflush(1);                  //stdout = 1

Следующий заказ бизнеса, << операторов. В C ++ это было бы легко (перегрузка операторов), но я не могу придумать ни одного способа сделать это в C.

Ответы [ 3 ]

8 голосов
/ 10 августа 2009

При размышлении об этом может помочь трансляция между синтаксисом оператора «<<» и синтаксисом функции «operator <<». Ваш пример C ++ эквивалентен этому фрагменту кода C ++: </p>

operator<< ( operator<< (cout, "Hello World!"), endl);

Первое, что вы должны здесь заметить, это то, что на самом деле в cout не так много хитрости. Что умно, так это функция operator <<, в частности, версия функции operator <<, которая принимает потоковый объект (то есть, что такое cout, но и многие другие тоже) в качестве первого аргумента. Или, точнее, диапазон функций operator <<, которые принимают объект потока в качестве первого аргумента и принимают конкретную вещь в качестве второго аргумента - есть один для каждого типа объекта, который вы можете поместить в поток cout. Вы также можете увидеть один из приемов C ++ в этом синтаксисе; Функции оператора << на объектах потока всегда возвращают объект потока, который им был передан, тем самым позволяя создавать цепочки такого типа. </p>

Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса C-подобных функций, большинство компиляторов C ++ "манипулируют" именами функций, чтобы закодировать в них тип аргументов, которые они имеют. (Также, конечно, «<<» не является допустимым именем C-подобной функции.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - они будут иметь суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную: </p>

operator_lshift__stream__endl(
  operator_lshift__stream__string(cout, "Hello World!"), endl);

И там у вас есть кое-что, что вы можете реализовать в C.

5 голосов
/ 10 августа 2009

Это верно, потому что C не имеет перегрузки операторов, вы не можете изменить поведение оператора <<, он всегда будет сдвигать бит, поэтому нет способа написать 'cout' с точной семантикой, которую он имеет в C ++, в C. </p>

Из интереса g ++ (компилятор GNU C ++) написан в основном на C.

4 голосов
/ 10 августа 2009

C на самом деле является популярным языком реализации для компиляторов C ++ и стандартных библиотек (так же, как и сам C ++ - на самом деле концепция, иногда известная как самостоятельное размещение или самозагрузка языка), и вы можете изучить целые источники богатых, сложная стандартная библиотека C ++ (плюс расширения) здесь (извините, это gcc 3 - не удается найти дерево исходников gcc 4, которое так же легко просматривать в Интернете, хотя, конечно, вы можете легко загрузить эти источники и изучите их на своей локальной машине).

Лично я бы предложил вместо этого начать с хорошей книги, такой как эта - источники станут намного более значимыми для вас, как только вы хорошо разберетесь во всех неясных уголках и трещины Cost iostreams (в качестве бонуса книга также проведет вас с экскурсией по локациям - держитесь за шляпу! -).

...