Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495

    [C vs C++] Parametro facoltativo

    Esiste in C standard la possibilita' di impostare che una funzione abbia un parametro facoltativo?

    In C++, con il gcc, se faccio:

    codice:
    int funzione(int parametro1, int parametro2 = 0)
    {
        // Implementazione
    }
    Poi posso chiamare la funzione cosi:

    codice:
    funzione(5);
    Senza ottenere errore. In C standard invece la dichiarazione:

    codice:
    int funzione(int parametro1, int parametro2 = 0)
    Non passa il compilatore, che ritorna errore. Esiste una sintassi o un metodo alternativo per fare in modo da replicare questo comportamento in C standard?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    :master:

    forse i 3 puntini:

    codice:
    void funzione(int parametro1, ...);
    potrebbe essere questo

    Cmq mi sembra che in C non ci sia il controllo sui parametri della funzione, puoi scrivere

    codice:
    void funzione();
    e dopo passare cmq parametri

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Il "..." è un discorso completamente diverso e serve per le funzioni con un numero arbitrario di parametri che sono tutta un'altra cosa. Piuttosto (non mi ricordo se nello standard ANSI C esistono gli argomenti di default) puoi fare un overload. Cioè tipo
    codice:
    void func(int a, int b)
    {
       //blablabla
    }
    
    void func(int a)
    {
       func(a, 0);
    }
    Ecco, questo credo si possa fare. E' meno elegante degli argomenti di default, ma l'effetto è lo stesso.

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da pprllo
    Il "..." è un discorso completamente diverso e serve per le funzioni con un numero arbitrario di parametri che sono tutta un'altra cosa. Piuttosto (non mi ricordo se nello standard ANSI C esistono gli argomenti di default) puoi fare un overload. Cioè tipo
    codice:
    void func(int a, int b)
    {
       //blablabla
    }
    
    void func(int a)
    {
       func(a, 0);
    }
    Ecco, questo credo si possa fare. E' meno elegante degli argomenti di default, ma l'effetto è lo stesso.
    il C non lo supporta l'overloading, questo xhè un compilatore C non modifica i nomi delle variabili in questo modo:

    codice:
    float f(int a, char b);
    //il compilatore C++ decora in _f_int_char per supportare l' 
    //overloading
    Infatti per non attivare questo "abbelimento" della firma in C++ si utilizza extern per attivare il linkage alternativo in C dove ciò non avviene:

    codice:
    extern "C" float f(int a, char b);
    Quindi non saprei implementare parametri facoltativi, ho guardato su Thinking C++, ma per ora non ho visto un modo per usarli anche in C, ho trovato solo conferma queste cose

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Ti ringrazio per il suggerimento, ora provo.

    Certo che e' veramente inelegante :|

  6. #6
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da *Ray*
    Ti ringrazio per il suggerimento, ora provo.

    Certo che e' veramente inelegante :|
    ho provato a compilare in C mode, viene lanciato un errore

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  7. #7
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Nel frattempo e' arrivata la seconda risposta. In effetti mi sembrava poco C standard.

    Il mio problema se proprio volete saperlo e' un problema di linking che non riesco a risolvere, ma essendo in ambito Linux non mi sono attentato a scriverlo, visto che il workaround del vero problema era compilare con il C.

    In pratica sto scrivendo una libreria e devo esportare dei simboli. Compilando con estensione .cpp mi accetta ovviamente i parametri facoltativi con valori di default, ma quando l'applicazione carica la libreria con dlopen fallisce con un errore chiaramente legato alla diversa convenzione fra C e C++ nel "decorare" i simboli.

    Se siete pratici e avete voglia, magari recupero l'errore esatto che mi da e cerchiamo di capire il problema.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.