È 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?
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. –
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. –
@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. –