Come rendere ovvio che si stia accedendo a una funzione dall'esterno?

9

Questa è una domanda specifica. Sto cercando di mantenere tutto il possibile all'interno dei limiti delle unità di traduzione, esponendo solo alcune funzioni tramite il file .h . Cioè, sto dando il static linkage agli oggetti a livello di file.

Ora, un paio di funzioni devono essere chiamate da altri moduli, ma non direttamente. Il mio modulo / file / unità di traduzione si abbona agli altri moduli, passando un puntatore a una funzione. Quindi, su un evento specifico, il puntatore viene chiamato con alcuni argomenti.

Quindi mi chiedo come rendere molto ovvio che tali funzioni sono chiamate da qualche luogo oscuro.

  • Dovrebbero essere static o extern (ed esporli in .h )?
  • Devo includere qualche suggerimento nel nome delle funzioni?
  • O è sufficiente inserire un commento "chiamato da X"?
posta Vorac 12.02.2014 - 14:38
fonte

5 risposte

2

Dal punto di vista dell'unità di compilazione (file), l'unica cosa di cui dovresti preoccuparti è se la funzione sia disponibile o meno all'esterno. Rendendolo disponibile significa che è stato progettato per essere chiamato, e dovresti operare partendo dal presupposto che quelle chiamate avverranno. La tua preoccupazione per la funzione stessa inizia al suo punto di ingresso. Il modo in cui il controllo arriva in primo luogo è importante solo per il codice che lo rende possibile.

Poiché il collegamento in ogni implementazione di C che conosco è simbolico, tutto ciò che chiama una funzione deve fare riferimento al suo simbolo:

foo();  /* Direct */

some_function_pointer_t funcs[] = { &foo, &bar, &baz };  /* Indirect */

Se dichiari erroneamente foo() come static , il tuo programma non collegherà. Se lo dichiari non- static , hai una funzione esposta che non viene chiamata. Le domande sull'utilizzo o meno di una funzione possono essere risolte scaricando le tabelle dei simboli dei file oggetto o cercandole nei sorgenti.

    
risposta data 13.02.2014 - 15:12
fonte
1

So I am wandering how to make it very obvious that those functions are called from some obscure location.

Definisci "oscuro".
I metodi dovrebbero essere esposti attraverso "interfacce" ben definite e, come già suggerito da Shivan Dragon, quelle "interfacce" sono i file .h. Se non si fornisce a un altro programma il file di intestazione "corretto", non è possibile chiamare il metodo.

Should they be static or extern (and expose them in the .h) ?

static potrebbe essere OK fino a quando non hai alcun costrutto [-like di classe] che contiene dati di istanza.
extern significa tu non implementarlo affatto; un'implementazione è "acquisita" da altrove durante il processo di collegamento.

Should I include some hint in the name of the functions?

Or is it enough to put a comment "called by X"?

Assolutamente no.

Commenti come questo, non importa quanto siano ben intenzionati, sono obsoleti nel momento in cui finisci di scriverli.

    
risposta data 12.02.2014 - 15:00
fonte
0

Se le funzioni di callback sono definite all'interno del modulo e l'utente non ne fornirà mai uno, penso che sia possibile utilizzare un segnaposto durante la fase di inizializzazione. Il segnaposto è in genere un enum che viene quindi tradotto internamente alla funzione static di destra.

    
risposta data 13.02.2014 - 13:38
fonte
0

Li farei comunque static (non sono pensati per essere collegati a e chiamati da chiunque) e contrassegnano il loro scopo come callback forniti a funzioni esterne nel loro nome.

static perché cerco di nascondere ciò che posso nascondere, per quanto posso nasconderlo.

Contrassegnali nel loro nome, perché a), i commenti non sono aggiornati e b), diventa ovvio nel luogo in cui viene fornito il callback che questa funzione è destinata a essere utilizzata in questo modo: questo fondamentalmente lo rende un bandiera rossa per prendere l'indirizzo di una funzione che non segue la convenzione di denominazione.

    
risposta data 13.02.2014 - 15:49
fonte
0

I modificatori di ambito dovrebbero essere usati principalmente come informazioni per il compilatore, non come una forma di documentazione "abbastanza vicina". L'uso di static , in particolare, consente a un compilatore C di rendere la funzione inutilizzabile dall'esterno del modulo, incluso come callback - non ciò che si desidera, anche se potrebbe funzionare con il compilatore corrente.

Ovviamente dovresti aggiungere un commento al codice, poiché puoi vedere che è una situazione potenzialmente confusa. Qualunque cosa inusuale o inaspettata ha bisogno di un commento appropriato. Ma, come affermato in altre risposte, i commenti possono essere letti o non essere aggiornati.

Quindi, l'unica opzione rimasta è denominare la funzione per indicare che si tratta di una richiamata. La maggior parte degli esempi che ho visto utilizzano _callback o _cb come suffisso o cb_ come prefisso. Usa il modulo lungo se i callback sono insoliti nel tuo codice, il modulo breve se sono comuni.

    
risposta data 15.02.2014 - 08:07
fonte

Leggi altre domande sui tag