una ternario operador multiple linea hacer formas elvis condicional c conditional-operator

ternario - ¿Operador condicional con un valor constante(verdadero)?



operador ternario java (2)

Es un código que verifica si se pasa el tipo correcto. El puntero p se pasa y, a lo largo del tipo de puntero, también se debe escribir manualmente en la macro.

La expresión ternaria siempre devolverá el segundo operando, pero tanto el segundo como el tercero se verificarán si su tipo coincide, y si no lo hacen, debería obtener un error del compilador.

Un ejemplo simple:

int* p = NULL ; 1 ? p : ( float* )p ; //error 1 ? p : ( int* )p ; //ok

Estaba viendo algunas macros de preprocesador usadas en OpenSSL, y encontré lo siguiente de crypto/stack/safestack.h :

#define CHECKED_STACK_OF(type, p) / ((_STACK*) (1 ? p : (STACK_OF(type)*)0)) #define CHECKED_SK_FREE_FUNC(type, p) / ((void (*)(void *)) ((1 ? p : (void (*)(type *))0))) #define CHECKED_SK_FREE_FUNC2(type, p) / ((void (*)(void *)) ((1 ? p : (void (*)(type))0)))

Supongo que está escrito de esa manera para evitar un error en el compilador (probablemente algo antiguo que el proveedor no ha respaldado en más de una década).

¿Cuál es el propósito de usar el 1 anterior ya que siempre es cierto?


Es una afirmación estática sobre el tipo de función antes del reparto, que proporciona un reparto seguro para el tipo.

Desde C11 (n1570) 6.5.15 (desde la sección de restricciones)

Operador condicional

(3) Se mantendrá uno de los siguientes para el segundo y tercer operandos:

  • [omitido cosas no puntero]
  • ambos operandos son punteros a versiones calificadas o no calificadas de tipos compatibles;
  • un operando es un puntero y el otro es una constante de puntero nulo; o
  • un operando es un puntero a un tipo de objeto y el otro es un puntero a una versión calificada o no calificada de void .

El tercer operando es un puntero a una función (por lo tanto, la última viñeta nunca se aplica), por lo que se compila (sin advertencia) solo si p es una constante de puntero nula o de un tipo compatible con void (*)(type) para el última macro (después de la conversión a un puntero de función, si p es un designador de función).