фильтры IE плюс CSS преобразовывает ( Safari и Firefox).
поддержка IE является самой старой, Safari имеет [по крайней мере, некоторых?] поддержка в 3.1.2, и Firefox не будет иметь поддержки до 3.1.
, С другой стороны, я рекомендовал бы соединение Canvas/VML или SVG/VML. (Холст имеет более широкую поддержку.)
Это верно, поскольку в C нет перегрузки операторов, вы не можете изменить поведение оператора <<, он всегда будет выполнять битовый сдвиг, поэтому невозможно написать cout с точной семантикой, которую он имеет в C ++, в C.
Из-за интереса, g ++ (компилятор GNU C ++) - это написано в основном на C.
Подумать об этом может помочь перевод между синтаксисом оператора «<<» и синтаксисом функции «оператор <<». Ваш пример C ++ эквивалентен этому фрагменту кода C ++:
operator<< ( operator<< (cout, "Hello World!"), endl);
Первое, что вы должны здесь заметить, это то, что на самом деле в cout вообще не так много хитрости. Что является умным, так это функция operator << - в частности, версия функции operator <<, которая принимает объект потока (которым является cout, но и многие другие вещи тоже) в качестве своего первого аргумента. Или, что еще точнее, диапазон функций operator <<, которые принимают объект потока в качестве первого аргумента и принимают конкретную вещь в качестве второго аргумента - есть по одному для каждого типа объекта, который вы можете поместить в поток cout. Вы можете увидеть в этом синтаксисе один из приемов C ++, тоже; функции operator << в объектах потока всегда возвращают объект потока, который им был дан, что позволяет создавать цепочки такого рода.
Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса функций, подобных C, большинство компиляторов C ++ "искажать" имена функций, чтобы закодировать в них тип аргументов, которые у них есть. (Кроме того, «<<» не является допустимым именем функции в стиле C.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - они будут иметь суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И вот вам кое-что, что вы можете реализовать на C.
функции на объектах потока всегда возвращают объект потока, который им был предоставлен, что позволяет создавать цепочки такого рода.Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса функций, подобных C, большинство компиляторов C ++ "искажают" имена функций, чтобы закодировать в них тип аргументов, которые у них есть. (Кроме того, «<<» не является допустимым именем функции, подобным C.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - они будут иметь суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И вот вам кое-что, что вы можете реализовать на C.
функции на объектах потока всегда возвращают объект потока, который им был предоставлен, что позволяет создавать цепочки такого рода.Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса функций, подобных C, большинство компиляторов C ++ "искажают" имена функций, чтобы закодировать в них тип аргументов, которые у них есть. (Кроме того, «<<» не является допустимым именем функции, подобным C.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - у них будут суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И вот вам кое-что, что вы можете реализовать на C.
Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса функций, подобных C, большинство компиляторов C ++ "искажают" имена функций, чтобы закодировать в них тип аргументов, которые у них есть. (Кроме того, «<<» не является допустимым именем функции, подобным C.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - они будут иметь суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И вот вам кое-что, что вы можете реализовать на C.
Чтобы поместить код C ++ в компоновщики и системные ABI, которые ожидают синтаксиса функций, подобных C, большинство компиляторов C ++ "искажают" имена функций, чтобы закодировать в них тип аргументов, которые у них есть. (Кроме того, «<<» не является допустимым именем функции, подобным C.) Итак, если вы посмотрите на сгенерированную сборку для этого бита функции, вы увидите, что имена двух функций были отличаются друг от друга - они будут иметь суффиксы, указывающие типы аргументов. Вы можете сделать что-то подобное вручную:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
И вот вам кое-что, что вы можете реализовать на C.
C на самом деле является популярным языком реализации для компиляторов C ++ и стандартных библиотек (на самом деле, как и сам C ++ - концепция, иногда известная как самостоятельный хостинг или самозагрузка языка), и вы можете изучить все исходники богатой сложной стандартной библиотеки C ++ (плюс расширения) здесь (извините, это gcc 3 - не могу найти дерево исходных текстов gcc 4, которое так же легко просматривать в Интернете, хотя, конечно, вы можете легко загрузить эти источники и изучить их на своем локальном компьютере).
Лично я бы посоветовал начать с хорошей книги, такой как эта - источники будут гораздо более значимыми для понимания вы, как только вы хорошо разберетесь во всех неясных уголках и закоулках iostreams C ++ (в качестве бонуса,книга также проведет вас с гидом по местам - держитесь за шляпу! -).