2012-06-26 19 views
13

tengo una macro que pasa el número de línea y el nombre del archivo a un controlador de errores:Comportamiento de las funciones en línea __LINE__ en

#define SYSTEM_FAILURE (error_code, comment) \ 
    System_Failure((error_code), (comment), __LINE__, __FILE__); 

cómo será el __LINE__ resolverse cuando se utiliza dentro de una función inline?

file.h: 
inline int divide(int x, int y) 
{ 
    if (y == 0) 
    { 
     SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, "divide by zero error"); 
    } 
    return x/y; 
} 

Will __LINE__ el número de línea en el archivo de cabecera, o el número de línea del archivo de origen, donde la función en línea se llama (compilador asumiendo realiza una "pegar" en el código fuente)?

+2

No se puede probar, ya que el comportamiento puede diferir en los compiladores y puede no ser lo que indica el estándar. –

+2

Downvoters: ¿Por qué el voto a favor? La pregunta surge del uso de C, funciones en línea y macros en un sistema integrado. –

+1

@Thomas, probando esto en su propio compilador e incluyendo los resultados en su pregunta (haciéndolo así más parecido a 'mi preprocesador hace esto, ¿es estándar?') Habría (y todavía puede) neutralizar a muchos de los votos a la baja. –

Respuesta

20

En C y C++, las macros no se evalúan (en su mayor parte) con ningún conocimiento del código real y se procesan antes del código (de ahí el nombre "preprocesador"). Por lo tanto, __FILE__ evaluaría "file.h" y __LINE__ evaluaría el número de línea correspondiente a la línea en la que SYSTEM_FAILURE aparece en file.h.

7

Dado que las macros se reemplazan por sus definiciones antes de la compilación, el __LINE__ contendrá la línea real del archivo en el que utilizó la macro. Inlinear no afectará este comportamiento en absoluto.

3

__LINE__ será la línea del archivo de encabezado ya que el preprocesador lo evaluará antes de que el compilador lo vea.

Cuestiones relacionadas