2011-01-13 8 views
6

È meglio #define _BSD_SOURCE o impostare CPPFLAGS = -D_BSD_SOURCE?Gli standard dovrebbero essere specificati nel codice sorgente o in CPPFLAGS?

Mi sembra che se un pezzo di codice sorgente si basa su uno standard particolare, è meglio scriverlo esplicitamente nel codice stesso con un #define. Tuttavia, molti commenti suggeriscono che specificare lo standard sulla linea di compilazione sia più appropriato. Quali sono i vantaggi di omettere lo standard dal codice sorgente e specificarlo solo in fase di compilazione?

risposta

6

Se si specifica definisce nell'origine c'è il rischio che lo stesso file di intestazione possa essere incluso in diversi file di origine (unità di traduzione) ma con diverse definizioni di preprocessore, che possono portare a una violazione di una regola di definizione che è spesso un dolore eseguire il debug.

Specificando le definizioni per l'intero progetto anziché nei singoli file di origine, la possibilità di tale violazione delle regole di definizione One viene ridotta al minimo.

Inoltre, se si presenta la necessità di aggiungere una nuova definizione, si modifica solo un makefile, anziché tutti i file di origine.

+0

Ma è possibile utilizzare standard diversi per ogni unità di traduzione. Se l'intero progetto è conforme a C89 eccetto che una TU usa un'estensione gnu, non è meglio per quel file #define _GNU_SOURCE piuttosto che contaminare l'intero progetto? In questo modo, se uso una funzione che dipende da uno standard più moderno di C89 in qualche altra TU, ma non sono a conoscenza di tale dipendenza, ne saprò al momento della compilazione. Se l'intero progetto dipende dallo standard moderno, rende più difficile rimuovere la dipendenza. –

+0

Devo confessare che non ho mai mescolato e abbinato sorgenti che richiedevano standard diversi (o definizione del preprocessore) in un binario. Se lo facessi, specificherò comunque i flag per quella particolare fonte nel makefile (come variabili specifiche del target) semplicemente perché tutti i miei flag del compilatore sono in un posto nel makefile. Inoltre, spesso compilo le mie fonti con diversi compilatori (g ++, SunCC) su piattaforme diverse, quindi è il makefile specifico della piattaforma che è il posto giusto per definire le definizioni specifiche della piattaforma. –

+1

@William: il problema è che se provate a mischiare standard diversi in diverse unità di traduzione, non vi è alcuna garanzia che sia possibile collegare in modo sicuro gli oggetti risultanti in un singolo file eseguibile. Potrebbe funzionare, o potrebbe fallire, o potrebbe sembrare funzionare, ma fornirti problemi difficili da diagnosticare in fase di esecuzione. –

Problemi correlati