Witam.
potrzebuje napisać makro gdzie w zależności od tego czy będę podawać do niego argumenty wywoła inną funkcję
MOJE_MAKRO() -> wywoła funkcję READ()
MOJE_MAKRO(A,B,C) -> wywoła funkcję WRITE(A,B,C)
jakieś sugestię?
Witam.
potrzebuje napisać makro gdzie w zależności od tego czy będę podawać do niego argumenty wywoła inną funkcję
MOJE_MAKRO() -> wywoła funkcję READ()
MOJE_MAKRO(A,B,C) -> wywoła funkcję WRITE(A,B,C)
jakieś sugestię?
https://stackoverflow.com/questions/14123954/the-same-name-macro-with-different-arguments – może być z tym problem.
po kilku godzinach poszukiwać prawdopodobnie znalazłem rozwiązanie z wykorzystaniem VA_ARGS i przeciążeniem funkcji
jednak wolałbym aby ktoś się wypowiedział czy czają się tutaj jeszcze jakieś "chochliki"
#include <iostream>
using namespace std;
#define SPIrw_HELPER(...) SPIrw(__VA_ARGS__)
#define var(...) SPIrw_HELPER(0x12,7,3,##__VA_ARGS__)
int SPIrw(uint8_t addr, uint8_t POS, uint8_t LEN, uint8_t val){ // write
// write value to SPI device
return 1;
}
int SPIrw(uint8_t addr, uint8_t POS, uint8_t LEN){ // read
// only read value from SPI device
return 2;
}
int main()
{
cout << var(7) << endl; // write = 1
cout << var() << endl; // read = 2
return 0;
}
Ale to miało wywoływać funkcje o zupełnie innej nazwie (w twoim przykładzie: READ i WRITE) a ten kod wywołuje funkcje o tej samej nazwie (SPIrw) tylko o różnej liczbie parametrów.
Więc albo podane rozwiązanie nie jest rozwiązaniem albo źle na początku sformułowałeś problem.
A zamiast makra nie lepiej opakować to w strukturę z przeładowanym operatorem wywołania? Albo za pomocą szablonów?
Ja to zrobiłem tak: https://gitlab.com/cdf-project/cdf-core/blob/master/ooc/src/ooc_macros.h#L7
Makro new
wywołuje w zależności od ilości argumentów odpowiednio makra _new0
, _new1
... Ale to jest chyba tylko dla gcc