Search code examples
cmacrosgetch

getch expects extra character


Hello I am new to programming and I am writing a program in C.

In my header file I have this macro:

#define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC

In my program I have this code

char keypressed()
{ char c;
c =getch();
return yesno(getch());
 }

So what I wanted to ask is why when I ask to return yesno(c) I have to press the button only once, while when I use return yesno(getch()) I have to press the button one two or three more times?

Is there a problem with getch() when called from a macro?


Solution

  • because when you use

    yesno(getch());
    

    It expands to :

    (getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`
    

    When the macro is expanded like this, it means that getch() could actually be called 1, 2 or 3 times because the logical || means:

    getch() == '\n' ? if true return ENTER, false test next one
    getch() == ' '  ? if true return ENTER, false test next one
    getch() == '\t' ? if true return ENTER, false return ESC
    

    If you use the gcc compiler you can find out what your macro expands to by using the -E flag:

    gcc -E myprog.c -o mprog.m