Это может помочь подумать об этом, чтобы перевести между синтаксисом оператора «< <» и «оператором < <» синтаксисом функции. Ваш C++ пример эквивалентен этому фрагменту кода C++:
operator<< (operator<< (cout, "Hello World!"), endl);
Первое, что вы должны заметить здесь, что есть на самом деле не много сообразительности в соиЬ вообще. Что является умным оператором < < Функция - в частности, версия оператора < < Функция, которая берет объект потока (что и есть cout, но многие другие вещи тоже) в качестве первого аргумента. Или, точнее, диапазон операторов < <, которые принимают объект потока в качестве первого аргумента, и берут конкретную вещь в качестве второго аргумента - для каждого типа объектов, который можно поместить в поток cout, есть один. Вы также можете увидеть один из трюков C++ в этом синтаксисе; оператор < < функции на объектах потока всегда возвращают объект потока, который они были заданы, тем самым обеспечивая цепочку такого рода.
Чтобы добавить код C++ в компоновщики и системные ABI, которые ожидают синтаксиса функции C-like, большинство компиляторов C++ «изменят» имена функций, чтобы кодировать в них тип аргументов, которые у них есть. (Также, конечно, «< <» не является допустимым именем функции C-типа.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена этих двух функций были отличные друг от друга - у них были бы суффиксы, указывающие типы аргументов.Вы могли бы сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И у вас есть что-то, что вы могли бы реализовать в С.
Не уверен, с чего начать на этом ... Короткий ответ в том, что C++ язык определяется так, чтобы синтаксис был подобным, а язык C - нет. - Но ваш вопрос можно взять из «Как написать компилятор для языка C-расширения?» вплоть до «Как дублировать функции iostream в пользовательской библиотеке с макросами C-стиля для специального синтаксиса?» –
@ Конкурирующий компилятор: Я знаю, что вы говорите. Вот почему я назвал это гипотетическим. Это не важно ... Мне просто интересно. – Kredns
Большинство компиляторов C++ написаны на C или C++ - и не в сборке. –