2012-04-28 12 views
10

Ho un programma C che tenta di modificare una stringa letter cost. Come ora ho imparato che questo non è permesso.perché clang ++ si comporta in modo diverso da clang poiché il primo è un collegamento simbolico di quest'ultimo?

Quando compilo il codice con clang test.c il compilatore non avvisa. Ma quando ho compilare con clang++ test.c dà un avvertimento:

test.c: 6: 15: avvertimento: conversione da stringa letterale di 'char *' è deprecato [-Wdeprecated-scrivibili-strings] char * s = "Ciao mondo"; ^

Il problema è che si scopre clang++ è solo un collegamento simbolo di clang:

ll `which clang++` 
lrwxr-xr-x 1 root admin 5 Jan 1 12:34 /usr/bin/[email protected] -> clang 

Quindi la mia domanda è come potrebbe clang++ si comporta in modo diverso da clang dato che si tratta di un legame simbolo di clang ?

risposta

11

Clang sta guardando il suo argv[0] e modifica il suo comportamento a seconda di ciò che vede. Questo è un trucco insolito e scoraggiato, ma non raro, che va almeno fino a 4.2BSD ex e vi, che erano lo stesso eseguibile e probabilmente più lontano.

In questo caso, clang sta compilando il file .c come C, e clang++ lo sta compilando come C++. Questa è una verruca storica su cui non dovresti fare affidamento; utilizzare il comando del compilatore appropriato e assicurarsi che l'estensione del file rifletta il vero contenuto del file.

+0

Vuoi dire che _bash_ sta guardando 'argv [0]' e alterando il comportamento? Quindi è difficile codificare in bash che 'clang ++' si comporta diversamente da 'clang'? – RockU

+1

Scusa, non ho pensato abbastanza. È codificato in "clang". Grazie :) – RockU

+1

Potrei ricevere una citazione su questa tecnica "non comune e scoraggiata"? Non intendendo bash, solo curioso. –

5

Per convenzione, il nome con cui viene richiamato un comando viene passato come argv[0]; non è particolarmente insolito che i programmi cambino il loro comportamento basandosi su questo. (Storicamente, cp e mv erano hardlinks per lo stesso eseguibile su Research Unix e utilizzavano argv[0] per decidere quale azione fare.Inoltre, la maggior parte delle shell cerca uno - leader in argv[0] per decidere se dovrebbero essere una shell di login.) Spesso c'è anche un altro modo per ottenere lo stesso effetto (opzioni, variabili d'ambiente, ecc.); in generale dovresti usare questo invece di giocare ai giochi argv[0].

Ci sono motivi per farlo, ma nella maggior parte dei casi non è una buona idea affidarsi a esso o progettare programmi attorno ad esso.

+0

+1 per avermi sostenuto. – zwol

Problemi correlati