¿Debo usar en línea o #define en este problema?

Trabajo con pthreads y quiero usar este código:

if(pthread_mutex_lock(&lock)){
        cout<<"error"<<endl;
        return ERROR;
    }

mi pregunta es debo hacerlo con #define o debería hacerlo con la función en línea:

inline void func() {

if(pthread_mutex_lock(&lock)){
        cout<<"error"<<endl;
        return ERROR;
    }

}

¿Debe la función ser estática? tal como:

static inline void func() 

preguntado el 03 de mayo de 12 a las 15:05

¿Qué beneficio obtienes de #define? -

¿Qué? Por como 10 caracteres. Y si lo escribe de forma segura, la macro será más larga. -

4 Respuestas

No deberías hacer nada con las macros si puedes evitarlo (y aquí, puedes evitarlo).

Si su función vive y se usa únicamente en un cpp, debe estar en un espacio de nombres sin nombre ...

namespace
{
    void func(){/*...*/}
}

Si se declara en un encabezado y está destinado a ser utilizado desde muchos otros cpp, no debe ser estático ni estar en un espacio de nombres sin nombre.

contestado el 03 de mayo de 12 a las 15:05

+1 solo por 'No deberías hacer nada con macros si puedes evitarlo'. - Martín James

No entiendo en absoluto qué tiene que ver el espacio de nombres con la pregunta. - miguel rebabas

@MichaelBurr preguntó si debería usar static, que en el espacio de nombres global especifica la vinculación interna, pero ese uso de estático se ha reemplazado por el uso de espacios de nombres sin nombre. - David

inline es irrelevante. Te das cuenta de que tendrás que hacer que la función tome como parámetro una referencia a cualquier tipo lock es, y luego permita un tipo de retorno.

Entonces haz algo como:

ErrorType func(LockType &lock) 
{
     if(pthread_mutex_lock(&lock))
     { 
           prtSysErr(!DIRECT_EXIT,!FATAL); 
           return ERROR; 
     } 
     return NOERROR;
} 

Entonces llámalo como:

if(func(lock)==ERROR)
{
     return ERROR;
}

Estoy llamando al tipo de cerradura LockType y el tipo de error ErrorType para que los coloques en lo que sean. También asumo el valor de que no se llame a ningún error. NOERROR similar.

Sí, y no lo llames funcy ponerlo en un namespace como dijo @Dave.

contestado el 03 de mayo de 12 a las 16:05

Esperemos lock no es mundial! - pubis

Esa es la persona que llama funcproblema de :) - Chris A.

La forma de C++ sería tomar el candado en un RAII manera y lanzar una excepción del constructor si falla el bloqueo. Ver este ejemplo.

contestado el 23 de mayo de 17 a las 11:05

No, no debe usar macro.
Puede marcarlo como en línea o simplemente usarlo como una función normal; el compilador lo alineará si encuentra un candidato apropiado para hacerlo.
Tenga en cuenta que si marca la función como static solo puede usarlo dentro de la Unidad de traducción donde lo declara.

¿Por qué?

Con las funciones, obtiene la verificación de tipo de los argumentos de la función que se pasan, no obtiene eso con la macro.
Además, con una macro está expuesto a efectos secundarios tontos y extraños que la macro podría producir.

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.