Avatar billede hurra Novice
03. juni 2009 - 14:47 Der er 3 kommentarer og
1 løsning

macro concat og __FUNCTION__

Jeg fik den ide, at jeg skulle bruge et id for mine funktioner, istedet for at bruge funktionen navn. Jeg er ikke længere rigtig sikker på at jeg har brug for det her til noget, men nu er det ved at gøre mig sindsyg at jeg ikke kan få det til at virke.

Mit program er meget simpelt, der er 3 elementer i det:
- En enum med alle funktions id'er
- En macro der skal concat'e 'fid_' og outputtet af macroen __FUNCTION__
- Og til sidst min main, hvor jeg vil skrive id'en for main ud

enum
{
  fid_main = 0
};

#define fid fid_##__FUNCTION__
/* Alternativer:
#define fid(a) fid_#a
*/

int main()
{
  cout << fid << endl;
}

Jeg kan godt se, at __FUNCTION__ er en text string, og det er nok ikke helt heldigt. Men det er jo helt konstant og fast defineret, det er jo ikke som at jeg har en runtime variable string eller char array, så det skal da kunne lade sig gøre.

Er det fordi det ikka kan lade sig gøre, eller hvad gør jeg forkert?
Avatar billede arne_v Ekspert
03. juni 2009 - 15:25 #1
__FUNCTION__ returnerer en streng ikke et navn.

Jeg er bange for at du bliver noedt til at lave et lookup.
Avatar billede arne_v Ekspert
03. juni 2009 - 15:29 #2
Altsaa noget a la:

#include <stdio.h>
#include <string.h>

#define START int getfid(const char *fnam) {
#define F(s,v) if(strcmp(fnam,#s)==0) return v;
#define END return -1; }
#define fid getfid(__FUNCTION__)

START
F(main,0)
END

int main()
{
    printf("%s\n", __FUNCTION__);
    printf("%d\n", fid);
    return 0;
}
Avatar billede hurra Novice
04. juni 2009 - 09:26 #3
Ja, jeg tænkte det nok. Det er nu heller ikke fordi det var helt vildt vigtigt, så jeg bruger bare __FUNCTION__ som den er.

Endnu en gang tak for hjælpen arne_v, kommer du med et svar?
Avatar billede arne_v Ekspert
04. juni 2009 - 14:57 #4
Gerne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester