141 votos

Características ocultas de C

Sé que hay una norma detrás de todas las implementaciones del compilador de C, por lo que no debería ser ninguna de las características ocultas. A pesar de eso, estoy seguro de que todos los programadores de C oculta/secretos trucos que usan todo el tiempo.

117voto

tonylo Puntos 2058

Más de un truco de el compilador GCC, pero usted puede dar rama indicación sugerencias para el compilador (común en el kernel de Linux)

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

ver: http://kerneltrap.org/node/4705

Lo que me gusta de esto es que también se añade expresividad a algunas funciones.

void foo(int arg)
{
     if (unlikely(arg == 0)) {
           do_this();
           return;
     }
     do_that();
     ...
}

78voto

Ben Collins Puntos 11318
int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t

Estos son un elemento opcional en el estándar, pero debe ser una característica oculta, porque las personas están en constante redefinición. Una base de código que he trabajado (y todavía lo hacen, por ahora) tiene múltiples redefiniciones, todos con diferentes identificadores. La mayoría de las veces es con macros del preprocesador:

#define INT16 short
#define INT32  long

Y así sucesivamente. Me dan ganas de tirar de mi pelo. Solo usar la maldita estándar entero typedefs!

73voto

Ben Collins Puntos 11318

El operador coma no es ampliamente utilizado. Ciertamente puede ser objeto de abuso, pero también puede ser muy útil. Este uso es el más común:

for (int i=0; i<10; i++, doSomethingElse())
{
  /* whatever */
}

Pero usted puede usar este operador en cualquier lugar. Observar:

int j = (printf("Assigning variable j\n"), getValueFromSomewhere());

Cada instrucción se evalúa, pero el valor de la expresión será la de la última expresión evaluada.

63voto

mike511 Puntos 637

la inicialización de la estructura a cero

struct mystruct a = {0};

esto va a cero todos los elementos de la estructura.

62voto

zvrba Puntos 14028

Los punteros a función. Se puede utilizar una tabla de punteros de función a implementar, por ejemplo, rápido indirectos subproceso código de intérpretes (ADELANTE) o de byte-code repartidores, o para simular OO-como a los métodos virtuales.

Luego hay joyas escondidas en la biblioteca estándar, tales como qsort(),bbusca(), strpbrk(), strcspn() [los dos últimos siendo útil para la implementación de un strtok() reemplazo].

Un misfeature de C es que firmó el desbordamiento aritmético es un comportamiento indefinido (UB). Así que cuando usted vea una expresión como x+y, siendo ambos firmaron enteros, potencialmente podría desbordarse y causar la UB.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X