2014-09-17 7 views
5

primo problema: E' possibile chiamare una funzione con dei parametri e diventa modificare per qualcos'altro dopo la compilazione sia in fase di pre-elaborazione o al momento della compilazione in qualcosa di simileE 'possibile modificare la "chiamata di funzione" al momento di pre-elaborazione o il tempo di compilazione

#define func(a,b) func(a,sizeof(a),b) 

Alcuni possono pensare perché un tale ne fosse bisogno.

In realtà io sono il porting del codice in Windows utilizzando Visual Studio 2010 e non v'è alcune funzioni che sono obsoleti come strcpy(), strcat(), ecc E dice di usare strcpy_s(), invece.

So che avrei potuto soppresso utilizzando #pragma disable(warning:) o fornendo bandiere come:

_CRT_NONSTDC_NO_DEPRRECATE 
_CRT_SECURE_NO_DEPRECATE 
_CRT_SECURE_NO_WARNINGS 

ma non mi wan't di ignorare o sopprimere.

Ho cercato di semplicemente sostituire la stringa anziché ignorare utilizzando:

#define strcpy strcpy_s 

come qui http://msdn.microsoft.com/en-us/library/td1esda9.aspx ho letto ci sarebbe disallineamento di argomenti se non fornisco il secondo arg.

voglio dire che dovrebbe essere ok se uso come questo:

#define strcpy strcpy_s 
strcpy(dest,src); 

Ma la sua non. Si continuano a produrre avvertimento.

Definizione strcpy_s è:

errno_t strcpy_s(
    char *strDestination, 
    size_t numberOfElements, 
    const char *strSource 
); 

secondo problema: Il primo argomento è un puntatore a una memoria allocata dinamicamente in modo da come posso ottenere la dimensione della memoria puntato da questo puntatore. Anche se ho letto che non è fattibile, ma ci deve essere qualche modo (si spera).

A proposito qual è _countof(var)?

+2

favore, per favore non farlo. Utilizzare le altre versioni o disattivare tali avvisi. – doctorlove

+7

1. Questa non è l'unica definizione di 'strcpy_s', come si è lasciato fuori [** le versioni template **] (http://msdn.microsoft.com/en-us/library/td1esda9.aspx) che deduce la dimensione da array fissi. 2. Non esiste un modo * portatile * per acquisire la dimensione di un'allocazione dinamica, dato solo il suo puntatore alla memoria grezza. Sono d'accordo con il dr. Non farlo. Se si desidera utilizzare le versioni di sicurezza della libreria di runtime, quindi * usarle *. 3. '_countof' è [** documentato qui **] (http://msdn.microsoft.com/en-us/library/ms175773.aspx) – WhozCraig

+4

+1 Solo perché le possibili soluzioni nella domanda sono terribili non lo fa Voglio dire che questa domanda è affatto male. Per quanto riguarda una risposta, evitare di utilizzare funzioni non standard se è necessario creare una piattaforma multipiattaforma. E non combattere la lingua troppo duramente. – Bathsheba

risposta

2

Queste funzioni sono NON obsolete. Microsoft sta cercando di indurre gli utenti a scrivere codice Microsoft-specifica sostenendo falsamente che stanno deprecato anche se il comitato ISO WG14 (chi è responsabile per loro) non ha fatto tale dichiarazione.

Definire i tre _CRT di macro dovrebbe essere considerato come il modo corretto di mettere il compilatore in un "un po 'più vicino alla standard" modalità, proprio come /Za.

0

Come MSalters stated, queste funzioni non sono deprecati, sono parte del C. di serie Sono sicuro se usato correttamente e non c'è niente di sbagliato con la soppressione di queste avvertenze, in particolare, durante la scrittura di codice portabile. (Loro (forse solo alcuni di essi, non so) sono standardizzati in allegato K dello standard C11, che non è obbligatoria.)

Ma io non voglio ignorare o sopprimere.

Perché? Non sopprimere avvertimenti non è una buona cosa in sé.

ho cercato di semplicemente sostituire la stringa invece di ignorare utilizzando:

#define strcpy strcpy_s 

che funziona per C++ solo (e solo per MS Windows, non so se C++ specifica qualcosa simile all'allegato K del C11) e anche lì, solo per gli argomenti dell'array. In C, è possibile ottenere un comportamento simile:

#define IS_ARRAY(arr) ((char *)(arr) == (char *)&(arr)) 
#define my_strcpy(a, b) (assert(IS_ARRAY(a)) , 
          strcpy_s((a), sizeof(a), (b))) 

o anche un'affermazione statica - per esempio Gcc consente ciò come un'espressione costante; lo standard lo consente, ma non lo richiede - ciò consentirebbe di trovare tutte le occorrenze degli argomenti del puntatore al momento della compilazione e di "correggerli" manualmente. (Ancora una volta, questa non è una soluzione, sia il codice è già al sicuro con strcpy o non lo è ancora, è solo più probabilità di crash.)

Come nota, il comportamento è indefinito, se una macro con il nome di una funzione di libreria standard è definito (se è inclusa l'intestazione associata). Pertanto, ho assunto che le chiamate strcpy siano già state sostituite da my_strcpy.

(come un'altra nota, parenthesize sempre i vostri argomenti di macro, come indicato sopra.)

Problemi correlati