Необычное использование оператора <<... не сдвиг ли это?

serial flash stream

Просматривая пример кода SDFS, я увидел следующее:

static ArduinoOutStream cout(Serial);
// F сохраняет строки во флэш-памяти для экономии оперативной памяти
cout << F("\ntype any character to start\n");

Что такое << что делать в этом случае? Более того, F, похоже, никогда не определялся до этого. Кажется, это полезный трюк, но я не понимаю, как он работает.

Полный код доступен здесь: https://github.com/greiman/SdFs/ blob/master/examples/SdInfo/SdInfo.ino

, 👍1


2 ответа


Лучший ответ:

2

Что такое << что делать в этом случае?

Он направляет данные в устройство вывода (поток).

  • http://www.cplusplus.com/doc/tutorial/basic_io/

Да, использование одних и тех же символов для разных целей сбивает с толку...

Более того, F, похоже, никогда не определялся до этого.

F() — это макрос. Он определяется ядром Arduino в WString.h:

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
,

Спасибо. В вашей последней строке используются символы < и >, которые я никогда не видел, вместе с указателем. Кажется, это не логические или арифметические операторы, так как мне их называть в поиске Google, чтобы понять ваш ответ?, @Bo Thompson

@BoThompson это шаблон <параметры>, @esoterik

Как бы вы назвали этот набор символов по сравнению с логическим оператором < и арифметическим оператором <?, @Bo Thompson


1

Чтобы устранить путаницу с оператором битового сдвига;

Он действительно обычно используется в качестве арифметического оператора для побитового сдвига, но кажется «перегруженным», поэтому при использовании с потоками он является «оператором вставки».

В частности, перегрузки вставки и извлечения потока оператор<< и оператор>> возвращает T&.

https://en.cppreference.com/w/cpp/language/operator_arithmetic

По сути, существует два определения слова «<<» операторная функция:

function <<(integer){//Сдвиг битов}
function <<(stream){//Присоединиться к потокам}
,