Pregunta

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
 __THROW;

He encontrado la definición de la función anterior en /usr/include/netinet/ether.h en una máquina Linux.

Puede alguien explicar lo que significan los guiones dobles frente a const (palabra clave), dir (identificador) y en el último __THROW.

¿Fue útil?

Solución

En C, símbolos comenzando con un subrayado seguido de una letra mayúscula o otro subrayado están reservados para la aplicación. Usted como usuario de C no debe crear ningún símbolos que comienzan con las secuencias reservados. En C ++, la restricción es más estricto; que el usuario no puede crear un símbolo que contiene un doble subrayado.

Teniendo en cuenta:

extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;

La notación __const está ahí para permitir la posibilidad (algo poco probable) que un compilador que este código se utiliza con anotaciones de soportes de prototipo, pero no tiene una comprensión correcta de la palabra clave estándar C89 const. Las macros autoconf todavía puede comprobar si el compilador tiene soporte para trabajar const; este código se podría utilizar con un compilador rota que no tiene ese apoyo.

El uso de __hostname y __addr es una medida de protección para usted, el usuario de la cabecera. Si se compila con GCC y la opción -Wshadow, el compilador le advertirá cuando las variables locales sombra una variable global. Si la función utilizada simplemente hostname en lugar de __hostname, y si tenía una función llamada hostname(), que habría un sombreado. Mediante el uso de denominaciones reservadas a la aplicación, no hay conflicto con su código legítimo.

El uso de __THROW significa que el código puede, en algunas circunstancias, ser declarada con algún tipo de 'especificación tiro'. Esto no es estándar C; es más como C ++. Sin embargo, el código puede ser utilizado con un compilador C, siempre que una de las cabeceras (o el propio compilador) define __THROW para vaciar, o para alguna extensión-compilador específico de la sintaxis de C estándar.


Sección 7.1.3 de la norma C (ISO 9899: 1999) dice:

  

7.1.3 identificadores reservados

     

Cada cabecera declara o define todos los identificadores que figuran en su subcláusula asociado, y   opcionalmente declara o define identificadores listados en sus futuras direcciones biblioteca asociados   subcláusula y los identificadores que siempre están reservadas ya sea por el uso o para su uso como archivo   identificadores ámbito de aplicación.

     

- Todos los identificadores que comienzan con un guión bajo y, o bien una letra mayúscula u otra   el subrayado es siempre reservada para cualquier uso.

     

- Todos los identificadores que comienzan con un guión siempre están reservados para uso como identificadores   con el ámbito de archivo, tanto en los espacios de nombres comunes y etiquetas.

     

- Cada nombre de macro en cualquiera de los siguientes incisos (incluyendo la futura biblioteca   direcciones) está reservado para uso como se especifica si se incluye cualquiera de sus cabeceras asociadas;   salvo que se indique expresamente lo contrario (ver 7.1.4).

     

- Todos los identificadores con enlace externo en cualquiera de las siguientes subcláusulas (incluyendo el   futuras direcciones de biblioteca) siempre están reservados para su uso como identificadores con externa   ligamiento. 154)

     

- Cada identificador con el ámbito de archivo enumerados en cualquiera de las siguientes subcláusulas (incluyendo el   futuras direcciones de la biblioteca) se reserva para su uso como un nombre de macro y como un identificador con   presentar alcance en el mismo espacio de nombres si se incluye cualquiera de sus cabeceras asociadas.

     

No hay otros identificadores son reservados. Si el programa declara o define un identificador en una   contexto en el que está reservado (que no sea permitida por 7.1.4), o define un reservado   identificador como un nombre de macro, el comportamiento es indefinido.

     

Si el programa elimina (con #undef) cualquier definición de la macro de un identificador en la primera   grupo listado anteriormente, el comportamiento es indefinido.

     

Nota al pie 154) la lista de identificadores reservados con externo vinculación incluye errno, math_errhandling,   setjmp y va_end.


Ver también ¿Cuáles son las reglas sobre el uso de un guión en un identificador de C ++ ; muchas de las mismas reglas se aplican tanto a C y C ++, aunque la regla de doble subrayado incrustado es en C ++ solamente, como se ha mencionado en la parte superior de esta respuesta.

Otros consejos

Los nombres con guiones dobles que están reservados para su uso por la aplicación. Esto no significa necesariamente que son internos per se, aunque a menudo son.

La idea es que no se le permite usar cualquier nombre empezando por __, por lo que la aplicación es libre de usarlos en lugares como expansiones de macro, o en los nombres de extensiones de sintaxis (por ejemplo __gcnew no es parte de C ++ , pero Microsoft puede agregarlo a C ++ / CLI seguros de que ningún código existente debe tener algo como int __gcnew; en ella que pararía la compilación).

Para saber lo que significan estas extensiones específicas, es decir __const tendrá que consultar la documentación de su compilador / plataforma específica. En este caso particular, probablemente debería considerar el prototipo en la documentación (por ejemplo, http://www.kernel.org/doc/man-pages/online/pages/man3/ether_aton.3.html ) sea la interfaz de la función e ignorar las decoraciones __const y que __THROW aparecerá en la cabecera real.

Por convención en algunas bibliotecas, esto indica que un símbolo particular es para uso interno y no está destinado a ser parte de la API pública de la biblioteca.

El subrayado en __const significa que esta palabra clave es una extensión del compilador y su uso no es portátil (La palabra clave const se añadió a C en una revisión posterior, el 89 creo). El __THROW es también una especie de extensión, supongo que se define en cierta __ __attribute (algo) si se utiliza gcc, pero no estoy seguro de eso y demasiado perezoso para comprobar. El __addr puede significar cualquier cosa, el programador quería que decir, es sólo un nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top