mini library example c++ linux unix macros history

c++ - library - makefile linux c



¿Cuál es la razón para tener identificadores sin reservas como macros incorporadas en gcc? (1)

gcc no se ajusta completamente a ningún estándar C por defecto.

-ansi con -ansi , -std=c99 , o -std=c1x y unix no estará predefinido. ( -std=c1x probablemente se convertirá en -std=c11 en una -std=c11 futura más reciente de gcc).

Es un poco confuso que esto esté documentado en el manual separado para el preprocesador GNU, no en el manual de gcc.

Citando la documentación del preprocesador GNU ( info cpp , versión 4.5):

El estándar C requiere que todas las macros específicas del sistema formen parte del "espacio de nombres reservado". Todos los nombres que comienzan con dos guiones bajos, o un guión bajo y una letra mayúscula, están reservados para que el compilador y la biblioteca los utilicen como lo deseen. Sin embargo, históricamente las macros específicas del sistema han tenido nombres sin un prefijo especial; por ejemplo, es común encontrar `unix ''definido en sistemas Unix. Para todas estas macros, GCC proporciona una macro paralela con dos guiones bajos agregados al principio y al final. Si se define `unix '', también se definirá` __unix__''. Nunca habrá más de dos guiones bajos; el paralelo de `_mips ''es` __mips__''.

Cuando se da al compilador la opción `-ansi '', o cualquier opción` -std'' que solicite una conformidad estricta, se eliminan todas las macros predefinidas específicas del sistema fuera del espacio de nombres reservado. Las macros paralelas, dentro del espacio de nombres reservado, permanecen definidas.

Estamos eliminando lentamente todas las macros predefinidas que están fuera del espacio de nombres reservado. Nunca debe usarlos en programas nuevos, y le recomendamos que corrija el código anterior para usar las macros paralelas siempre que lo encuentre. Tampoco recomendamos que utilice las macros específicas del sistema que se encuentran en el espacio de nombres reservado. A la larga, es mejor verificar específicamente las funciones que necesita, utilizando una herramienta como `autoconf ''.

La versión actual del manual está here .

Hoy me topé con un error de compilador bastante interesante:

int main() { int const unix = 0; // error-line return unix; }

Da el siguiente mensaje con gcc 4.3.2 (sí, antiguo ...):

error: expected unqualified-id before numeric constant

que es definitivamente bastante confuso.

Afortunadamente, clang (3.0) es un poco más útil (como es habitual):

error: expected unqualified-id int const unix = 0 ^ <built-in>:127:14: note: expanded from: #define unix 1 ^

Ciertamente no esperaba que unix , que no está escrito en mayúsculas, ni que comience con un guión bajo, sea una macro, especialmente una incorporada.

Verifiqué las macros predefinidas en gcc y hay 2 (en mi plataforma) que usan símbolos "no reservados":

$ g++ -E -dM - < /dev/null | grep -v _ #define unix 1 #define linux 1

Todos los demás son macros "de buen comportamiento" con guiones bajos, usando los identificadores reservados tradicionales, muestra:

#define __linux 1 #define __linux__ 1 #define __gnu_linux__ 1 #define __unix__ 1 #define __unix 1 #define __CHAR_BIT__ 8 #define __x86_64 1 #define __amd64 1 #define _LP64 1

(Es un desastre y no parece haber ningún orden en particular ...)

Además, hay muchos símbolos "similares", así que supongo que hay un problema de compatibilidad con versiones anteriores ...

Entonces, ¿de dónde vienen las macros de unix y linux ?