Почему в библиотеке к SIM900 два раза записана функция с одинаковым именем?
В библиотеке к ардуино для SIM900 несколько раз встречаются функции с один и тем же именем но разными параметрами. Например:
void sim900_send_cmd(const char* cmd)
{
for(int i=0; i<strlen(cmd); i++)
{
sim900_send_byte(cmd[i]);
}
}
void sim900_send_cmd(const __FlashStringHelper* cmd)
{
int i = 0;
const char *ptr = (const char *) cmd;
while (pgm_read_byte(ptr + i) != 0x00) {
sim900_send_byte(pgm_read_byte(ptr + i++));
}
}
Как в этом случае будет выполняться код?
https://github.com/Seeed-Studio/GPRS_SIM900
Ответы (2 шт):
На то и С++, чтоб можно было писать функции с одинаковыми именами, но разными типами аргументов. Называется это перегрузкой. Вызываемая функция определяется переданными аргументами.
Например,
void f(const char * s) { cout << s << endl; }
void f(int i) { cout << "int: " << i << endl; }
При вызове
f("Hello");
будет вызвана первая, при
f(5);
вторая. См. https://ideone.com/ImZqDP
То же и в вашем примере - у показанных вами функций разные типы параметров.
Про перегрузку Harry уже дал ответ, а вот для чего именно здесь так сделано поясню. В микроконтроллерах достаточно мало памяти, и сохранять все константы в ОЗУ не получится, иначе ОЗУ быстро кончится, и именно по этому, при вызове функции, если нужно передать какую-то константу, например строку, её размещают во flash памяти, и в функцию передают указатель на строку находящуюся во flash памяти, таким образом не расходуя дефицитную RAM память. В различных контроллерах структура доступа к памяти различна, например в STM32 и флеш и ОЗУ находится в одном адресном пространстве и там можно было бы обойтись одной функцией, а вот в AVR гарвордская структура и доступа к различным типам памяти (RAM, Flash, EEPROM) требуются различные действия (которые компилятор делает скрыто от пользователя) и для этого компилятору требуется указать к какому типу памяти требуется обратиться.