2011-03-20 13 views
7

Haciendo cc -std=c99 example.c en el siguiente simplificada example.c archivo:¿Cómo alinear y usar correctamente una función en línea en C99? (Generación falla)

inline void a() 
{ 
} 

int main() 
{ 
    a(); 

    return 0; 
} 

me obtiene:

En función `principal:
example.c :(texto + 0x7).: referencia indefinida a 'a'
collect2: ld devolvió el código de salida 1

Según entiendo este tiene que ver con el requisito de la norma C99 para exigir exactamente una definición más para cada función en línea no estática que se utiliza en los casos en que el cuerpo no se puede alinear? Si eso es así, supongo que podría hacerlo con static inline en su lugar, pero no quiero que me muerda más tarde, entonces, ¿cuál sería el mejor curso de acción aquí? Obviamente, me quiero quedar con C99 y quiero alinear algunas funciones. (Sí, soy consciente de que el compilador normalmente sabe qué alinear sin que se lo diga, pero tengo mis razones)

+0

La palabra clave 'inline' no es lo que crees que es. En el mejor de los casos, es una pista para el compilador de que este código puede ser un candidato para estar en línea. En el peor de los casos, es ignorado. – jer

+0

¿Puede compilar otros archivos a través de su cc? Tal vez problema en el compilador. –

+0

En realidad estoy usando '-Winline', así que en mi caso no será ignorado. Perdóneme por no haber especificado esto, pero no creo que alguien esté comentando lo que significa "en línea" en C o que reacciona a ese lado de los asuntos. En la mayoría de las otras variaciones de lo anterior, por supuesto tiene toda la razón. @Mihran no, no hay problema con el compilador. Después de verificar más de cerca con las especificaciones C99, he especificado las funciones en línea en cuestión como 'static inline' y todo funciona. Sí quiero saber si estoy dando los pasos correctos aquí ... – amn

Respuesta

0

No hay prototipo de función, eso es todo, por lo que la firma de la función se deduce y se deduce erróneamente. Agrega "void a();" en la parte superior del archivo, y ya está todo listo.

+0

sí, eso funciona si 'a' se define en la misma unidad de traducción (que es el caso con el ejemplo que he dado). Sin embargo, tan pronto como trato de 'compartir' esta función en línea poniendo su definición en su propio encabezado e incluyendo este encabezado de dos o más unidades de traducción, no funciona y aparece la 'definición múltiple de' a 'en su lugar. . ¿Lo que da? – amn

6

Probablemente no tenga ese error cuando compile con -O2 más o menos.

Inline definiciones de funciones deben ir en los archivos de cabecera y un extern inlinedeclaración deben ir en una unidad de compilación. Hacer

inline void a(void){ 
// empty 
} 

// in just one .c file 
#include "the-file.h" 
extern inline void a(void); 

Por cierto, declarando a sin void no es un prototipo.

+0

ok, eso es interesante. ¿Cómo procedo si necesito la definición de 'a' para usar en varias unidades de traducción? – amn

+0

@amn, ponga solo la definición 'inline' * en un archivo de encabezado y la declaración' extern inline' en una de las unidades de traducción. Tenga en cuenta que realmente necesita un compilador compatible con C99 para eso. Gcc más nuevo, por ejemplo, haría. –

+0

@JensGustedt Seguiré diciendo esto cada vez que encuentre a alguien que lo reclame, pero el archivo fuente también debe contener la definición. – YoYoYonnY

Cuestiones relacionadas