Brauche Hilfe



  • Ich dachte ich verstehe jedenfalls etwas die C Syntax aber jetzt habe ich in einem fremden Code ein paar Funktionen gefunden, die ich nicht verstehe. Hier mal zwei Beispiele

    #define LOADIP(_a_,_b_)\
    {\
        char __tmp[20];\
        if (GetPrivateProfileInt (_a_, "VALID", 0, client->inipath))\
        {\
            GetPrivateProfileString (_a_,\
                                     "VALUE",\
                                     "",\
                                     __tmp,\
                                     sizeof(__tmp),\
                                     client->inipath);\
            client->settings._b_=inet_addr(__tmp);\
        }\
        else\
            client->settings._b_=INVALID_SETTING;\
    }
    
    #define SENDCS(_a_,_b_)\
    {\
        if (client->_a_[0]!=INVALID_SETTING)\
            TLV_SendString(client->socket,_b_,client->_a_);\
    }
    

    Kann mir das mal jemand erklären? Wieso beginnen die mit #define? Wieso haben die Parameterlisten keine Typangaben? Was soll der Backslash am Ende jeder Zeile?
    Danke im Voraus 🙂



  • Hi,

    hierbei handelt sich um eine präprocessor anweisung. _a_ und _b_ sind nur platzhalter für die eigentlichen parameter. Der typ ist egal weil hier der compiler noch garnicht seine finger drinnen hat. Der präprozessor ersetzt nur text und macht keine typprüfungen. Die '\' sind teil der syntax und bieten die möglichkeit zeilenumbrüche in solche anweisung zu bauen. Anders wäre das nicht möglich bzw. würde vom präpro angemeckert werden.

    Das ergebniss eines aufrufs der form

    void some_func(){
    
    int i=3;
    
    //tu was
    
    LOAD_IP(foo,bar)
    
    //tu noch was
    
    printf("%d\n",i);
    
    }
    

    wäre nach dem preprocessing:

    void some_func(){
    
    int i=3;
    
    //tu was
    
    {
        char __tmp[20];
        if (GetPrivateProfileInt (foo, "VALID", 0, client->inipath))
        {
            GetPrivateProfileString (foo,
                                                 "VALUE",
                                                 "",
                                                __tmp,
                                               sizeof(__tmp),
                                              client->inipath);
            client->settings.bar=inet_addr(__tmp);
        }
        else
            client->settings.bar=INVALID_SETTING;
    }
    
    //tu noch was
    
    printf("%d\n",i);
    
    }
    

    _a_ wird immer durch foo ersetzt und _b_ immer durch bar, und zwar BEVOR die eigentlich compile-phase losgeht.


Anmelden zum Antworten