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)
?
favore, per favore non farlo. Utilizzare le altre versioni o disattivare tali avvisi. – doctorlove
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
+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