2012-05-25 5 views
5

Usiamo un modello "COM-like" dove lavoro, come generalmente seguiamo le regole COM, ma non eseguiamo la compilazione MIDL e non miriamo ad altre lingue di c/C++. In quanto tale, so che posso sempre piegare le regole in base alle mie esigenze, ma cerco di non farlo, perché un giorno potremmo voler diventare veramente compatibili con COM e, se quel giorno arriverà, vogliamo che sia il più indolore possibile.Come generare un avviso deprecato per un metodo in un'interfaccia COM (C++)

Desidero stampare un avviso quando qualcuno compila il codice utilizzando un determinato metodo da un'interfaccia specifica. In C++ (supportiamo solo il compilatore Microsoft), aggiungeremo __declspec(deprecated) prima della dichiarazione della funzione per raggiungere il nostro obiettivo.

Posso solo aggiungere questo davanti alla dichiarazione del mio metodo di interfaccia o c'è un modo migliore, più COM per farlo?

Vorrei anche sapere se è sufficiente aggiungere __declspec(deprecated) di fronte al metodo per costringere gli utenti a ricompilare (vorrei evitarlo, se possibile).

Grazie

Aggiornamento

Ho provato ad utilizzare __declspec(deprecated) di fronte alla mia dichiarazione di metodo come questo:

struct Interface : public IUnknown 
{ 
    __declspec(deprecated) virtual HRESULT __stdcall OldMethod 
    (
     int Arg1; 
     int Arg2; 
    ) = 0; 

    virtual HRESULT __stdcall NewMethod 
    (
     //arguments... 
    ) = 0; 
} 

Con questo modo di deprecando un metodo, non ottengo alcuna avviso del compilatore a tutto quando si tenta di utilizzare OldMethod. C'è una limitazione che non conosco sull'uso di __declspec(deprecated) con metodi virtuali puri?

Grazie ancora

risposta

6

__declspec(deprecated) è una caratteristica a livello sorgente della MS C/C++, e non influenzeranno il layout binario (ABI) di nulla - quindi gli utenti non dovranno ricompilare. L'effetto è di inviare un avviso in fase di compilazione a chiunque chiami quel metodo includendo il tuo file di intestazione C++. Non avrà alcun effetto sulle persone che usano il tuo oggetto come oggetto COM senza includere la tua intestazione, ad es. da un'altra lingua Non credo che COM/IDL fornisca un analogo attributo "deprecato".

Quindi, in breve, si può anche aggiungere l'attributo a beneficio degli utenti C++, ma se si forniscono sempre utenti COM generali, dovranno fare affidamento sulla documentazione fornita per sapere che il metodo è deprecato.

+0

Quando provo ad usare '__declspec (deprecato)' nel file di intestazione dichiarando il metodo di interfaccia che voglio deprecare (che è un metodo virtuale puro), non ricevo alcun avvertimento durante la compilazione del codice che usa quel metodo. Tuttavia, se uso la macro '#pragma deprecated', ricevo un avvertimento. Questo è meglio di niente, ma l'uso della macro è meno preciso rispetto a __declspec, poiché con quello posso specificare un messaggio di avviso personalizzato. Inoltre, la macro '#pragma deprecated' avrà come target qualsiasi identificatore che abbia il nome del mio metodo, anche se non dall'interfaccia. Hai qualche idea sul perché questo accade? – franmon

+0

E grazie per la tua risposta. La contrassegnerò come vincente se nessun altro mi fornirà una soluzione su cosa posso fare per poter usare la direttiva '__declspec (deprecato)', poiché la tua spiegazione è molto buona. – franmon

+0

@franmon: non viene mostrato il codice del sito di chiamata. Stai chiamando il metodo su un oggetto di tipo statico Interface * (o Interface &)? – ndkrempel