Macro F() error

Good evening, I am having a problem after Arduino IDE update 2.10.

The F() flash macro used for storing strings in flash memory no longer appears to be working as of the 2.10 version. The following error is reported during compile for each use.

error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(str) (str)

error cannot convert 'const __FlashStringHelper*' to 'const char '

This will help.

The code was working fine before the update, every library that uses macro F() is having that problem.

The code:

//Libraries
#include <SPI.h>//SPI - Arduino Reference
#include <MFRC522.h>//GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522
/*
Vcc <-> 3V3 (ou Vin(5V), dependendo da versão do módulo)
RST (Reset) <-> D22
GND (Masse) <-> GND
MISO (Master Input Slave Output) <-> 19
MOSI (Master Output Slave Input) <-> 23
SCK (Serial Clock) <-> 18
SS/SDA (Slave select) <-> 21
*/

//Constants
#define SS_PIN 21
#define RST_PIN 22
//Parameters
const int ipaddress[4] = {103, 97, 67, 25};
//Variables
byte nuidPICC[4] = {0, 0, 0, 0};
MFRC522::MIFARE_Key key;
MFRC522 rfid = MFRC522(SS_PIN, RST_PIN);
void printHex(byte buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], HEX);
}
}
void readRFID(void ) { /
function readRFID */
////Read RFID card
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
// Look for new 1 cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( !rfid.PICC_ReadCardSerial())
return;
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}

Serial.print(F(""rfid":""));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.print(F("""));
Serial.println();
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}

void setup() {
//Init Serial USB
Serial.begin(115200);
Serial.println(F("Initialize System"));
//init rfid D8,D5,D6,D7
SPI.begin();
rfid.PCD_Init();
Serial.print(F("Reader :"));
//rfid.PCD_DumpVersionToSerial();
}
void loop() {
readRFID();
}

/**
Helper routine to dump a byte array as hex values to Serial.
*/

/**
Helper routine to dump a byte array as dec values to Serial.
*/

Doesn't the compiler complain about the italics?

Error code:

In file included from C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/Arduino.h:176,
from c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:7:
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In static member function 'static const __FlashStringHelper* MFRC522::GetStatusCodeName(MFRC522::StatusCode)':
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1303:29: note: in expansion of macro 'F'
case STATUS_OK: return F("Success.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1304:31: note: in expansion of macro 'F'
case STATUS_ERROR: return F("Error in communication.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1305:34: note: in expansion of macro 'F'
case STATUS_COLLISION: return F("Collision detected.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1306:32: note: in expansion of macro 'F'
case STATUS_TIMEOUT: return F("Timeout in communication.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1307:32: note: in expansion of macro 'F'
case STATUS_NO_ROOM: return F("A buffer is not big enough.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1308:38: note: in expansion of macro 'F'
case STATUS_INTERNAL_ERROR: return F("Internal error in the code. Should not happen.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1309:32: note: in expansion of macro 'F'
case STATUS_INVALID: return F("Invalid argument.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1310:34: note: in expansion of macro 'F'
case STATUS_CRC_WRONG: return F("The CRC_A does not match.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1311:35: note: in expansion of macro 'F'
case STATUS_MIFARE_NACK: return F("A MIFARE PICC responded with NAK.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1312:23: note: in expansion of macro 'F'
default: return F("Unknown error");
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In static member function 'static const __FlashStringHelper* MFRC522::PICC_GetTypeName(MFRC522::PICC_Type)':
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1351:39: note: in expansion of macro 'F'
case PICC_TYPE_ISO_14443_4: return F("PICC compliant with ISO/IEC 14443-4");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1352:37: note: in expansion of macro 'F'
case PICC_TYPE_ISO_18092: return F("PICC compliant with ISO/IEC 18092 (NFC)");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1353:39: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_MINI: return F("MIFARE Mini, 320 bytes");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1354:37: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_1K: return F("MIFARE 1KB");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1355:37: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_4K: return F("MIFARE 4KB");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1356:37: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_UL: return F("MIFARE Ultralight or Ultralight C");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1357:39: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_PLUS: return F("MIFARE Plus");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1358:41: note: in expansion of macro 'F'
case PICC_TYPE_MIFARE_DESFIRE: return F("MIFARE DESFire");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1359:36: note: in expansion of macro 'F'
case PICC_TYPE_TNP3XXX: return F("MIFARE TNP3XXX");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1360:39: note: in expansion of macro 'F'
case PICC_TYPE_NOT_COMPLETE: return F("SAK indicates UID is not complete.");
^
C:\Users\Icaro\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.8\cores\esp32/WString.h:38:42: error: cannot convert 'const char*' to 'const __FlashStringHelper*' in return
#define F(string_literal) (string_literal)
^
c:\Users\Icaro\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:1362:24: note: in expansion of macro 'F'
default: return F("Unknown type");
^

exit status 1

Compilation error: exit status 1

It appears to be happening only on ESP32 dev module board, I see.

The implementation of the F() macro was changed in ESP32 core version 2.0.8.
It is now

#define F(string_literal) (string_literal)

instead of casting to const __FlashStrinHelper *.
This breaks use cases like

const __FlashStringHelper *MFRC522::GetStatusCodeName(MFRC522::StatusCode code  ///< One of the StatusCode enums.
                                        ) {
    switch (code) {
        case STATUS_OK:             return F("Success.");
        case STATUS_ERROR:          return F("Error in communication.");
        ...
        default:                    return F("Unknown error");
    }
} // End GetStatusCodeName()

Downgrade to ESP32 core 2.0.7.

1 Like

yes that worked...i downgraded both the esp32 as well as the mfrc522 library...and it worked very well. Thank you, i was struggling with this for 2 days.. thnkss

I had the same issue, thank you for this post!

I wonder why they would introduce a breaking change like that.

I had the same issue. Here's how I solved it:


after deleting, click build, the new version will be downloaded and everything will work.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.