Makro generujące funkcje dla różnych typów zmiennych

0

Cześć od razu mówię że nie do końca rozumiem ten mechanizm.
Próbuje zrobić makro które będzie tworzyło funkcje do czytania wartości wprowadzonych z klawiatury dla różnych typów zmiennych
odpowiednio dla inta wygeneruje funkcje** int read_int(int data,int size)*
Makro ma przyjmowac typ zmiennej oraz tekst formatujacy do funkcji scanf czyli np. "%d".

#define CREATE_READ_FUNCTIONS(TYPE,SCAN){\ 
int read_##TYPE(#TYPE *data,int size){\	
int i;\
for(i=0;i<size;i++)\
{\
	scanf(#SCAN,data+i);\
}\
}\
}

Stworzyłem cos takiego jednak nie działa to poprawnie.

0

czemu definicję funkcji zamykasz w {}?

0

Tak jak mowie nie dokońca wiem jak to działa.

0

To odpal kompilator z odpowiednimi przełącznikami (dla gcc -E) i zobacz jak wygląda efekt.

0

Czyli w makrze ma być sama deklaracja bez definicji?

0

Zapewne powinna być też definicja, nie o to pytałem. Zobaczyłeś co robi z tym makrem kompilator?

0

Odpaliłem kompilator nie zglasza zadnych problemów, gdy najpierw wywoluje CREATE_READ_FUNCTIONS(int,"%d"); a następnie read_int(data,10); kompilator mowi mi że odwołuję się do funkcji ktora nie istnieje.

0

Czym to kompilujesz? Ani gcc ani clang tego nie łykają

0

Zmieniłem troszeczkę.

#define CREATE_READ_FUNCTIONS(TYPE,SCAN){\
int read_##TYPE(TYPE *data,int size){\
int i;\
for(i=0;i<size;i++)\
{\
    scanf(#SCAN,data+i);\
}\
}\
}

GCC na linuxie.

0

No to u mnie nie działa:

[pts/0:krzaq@ArchVM:~/downloads]% cat foo.c
#include <stdio.h>

#define CREATE_READ_FUNCTIONS(TYPE,SCAN){\
int read_##TYPE(TYPE *data,int size){\
int i;\
for(i=0;i<size;i++)\
{\
    scanf(#SCAN,data+i);\
}\
}\
}

CREATE_READ_FUNCTIONS(int, %d)

int main()
{
}
[pts/0:krzaq@ArchVM:~/downloads]% clang  foo.c
foo.c:13:1: error: expected identifier or '('
CREATE_READ_FUNCTIONS(int, %d)
^
foo.c:3:41: note: expanded from macro 'CREATE_READ_FUNCTIONS'
#define CREATE_READ_FUNCTIONS(TYPE,SCAN){\
                                        ^
1 error generated.
0

okej ale dalej kompletnie nie rozumiem dlaczego tak sie dzieje. Proszę o jakieś wskazówki.

0
kq napisał(a):

To odpal kompilator z odpowiednimi przełącznikami (dla gcc -S) i zobacz jak wygląda efekt.

Wskazówki zostały już udzielone, tylko je zignorowałeś.

0

nie zignorowałem, jak funkcja ma działać bez zamkniecia jej w klamrach?

0

Tak jak wszystkie inne. W C żadnych funkcji nie zamykasz w klamrach.

0

Nie rozumiem czyli np. funkcji.

int sum(int a,int b)
{
 return a+b;
}

nie zamykam w klamrach?

0

No nie, przecież funkcja nie znajduje się tu w żadnych klamrach.

{
int sum(int a,int b)
{
 return a+b;
}
}

Powyższe nie ma sensu, a właśnie tak robisz

0

Okej jestem dzbanem wreszcie zrozumiałem o czym mówiłeś, dzieki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1