C --> C++ - Pointer casten?



  • Hi

    Hab Probleme ein Beispiel Code für C zu compilieren in C++ (gcc)
    Hoffe es kann mir jemand helfen, das gerade zu biegen

    void func(char *name);
    
    int main()
    {	
    //...
            my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
            for(i = 0; i < n_choices; ++i)
    	{       my_items[i] = new_item(choices[i], choices[i]);
    		/* Set the user pointer */
    		set_item_userptr(my_items[i], func);  //<---------
    	}
    

    error: invalid conversion from ‘void ()(char)’ to ‘void*’
    error: initializing argument 2 of ‘int set_item_userptr(ITEM*, void*)’

    Und hier nochmal:

    case 10: /* Enter */
    			{	ITEM *cur;
    				void (*p)(char *);
    
    				cur = current_item(my_menu);  // <---------
    				p = item_userptr(cur);
    				p((char *)item_name(cur));
    				pos_menu_cursor(my_menu);
    				break;
    			}
    

    error: invalid conversion from ‘void*’ to ‘void ()(char)’

    Ist aus dem ncurses HowTo

    Wär für Hilfe wirklich dankbar
    Grüsse

    ps::sry wenn dasnicht hierher gehört, bitte verschieben



  • Warum compilierst du es denn dann als C++ Programm, anstatt einfach in C, wenn es sowieso ein C Programm ist.

    In C++ können keine Funktionspointer implizit in void* gecastet werden, d.h. das mußt du dann explizit machen, also

    set_item_userptr(my_items[i], (void *)func);
    


  • Danke, werds probieren.

    Th schrieb:

    Warum compilierst du es denn dann als C++ Programm, anstatt einfach in C, wenn es sowieso ein C Programm ist.

    Weil ich die ncurses Funktionen in ne Klasse packen und in meinem C++ Programm nutzen möchte.



  • Wenn func(char* name) aus einem C Code (oder einer C-Lib) aufgerufen werden soll, aber in einem C++-Modul liegt, sollte es als

    extern "C" void (char *name);
    

    deklariert werden, bzw. die Implementation(en) markiert durch:

    extern "C"
    {
    
        void func(char* name)
        {
            // ...
        }
    
        // möglicherweise weitere...
    
    }
    


  • extern "C" void (char *name);
    

    sollte natürlich

    extern "C" void func(char *name);
    

    sein, sorry. 🙄



  • Ahso?
    Danke.

    Aber ich werd mich nun eh noch mal intensiv nach nem C++ Framework umsehen, ncurses ist mir irgendwie zu sehr C. Ich mag die formatierten string Funktionen nicht (printf() etc..) und das Zeigergehampel ist auch nicht so schön.


Anmelden zum Antworten