Algunos antecedentes: Si quería utilizar para, por ejemplo, scanf()
para convertir una cadena en un tipo entero estándar, como uint16_t
, que haría uso de SCNu16
<inttypes.h>
, así:¿Cómo convertir una cadena en un tipo entero poco común?
#include <stdio.h>
#include <inttypes.h>
uint16_t x;
char *xs = "17";
sscanf(xs, "%" SCNu16, &x);
Sin embargo, un mayor tipo entero no común como pid_t
no tiene tal cosa; solo los tipos enteros normales son compatibles con <inttypes.h>
. Para convertir a la inversa, a printf()
portable un pid_t
, puedo echarlo a intmax_t
y utilizar PRIdMAX
, así:
#include <stdio.h>
#include <inttypes.h>
#include <sys/types.h>
pid_t x = 17;
printf("%" PRIdMAX, (intmax_t)x);
Sin embargo, no parece ser una manera de forma portátil scanf()
en un pid_t
. Entonces esta es mi pregunta: ¿cómo hacer esto de forma portátil?
#include <stdio.h>
#include <sys/types.h>
pid_t x;
char *xs = 17;
sscanf(xs, "%u", &x); /* Not portable! pid_t might not be int! /*
pensé en scanf()
ing a un intmax_t
y después de comprobar que el valor está dentro de los límites pid_t
's antes de echar a pid_t
, pero no parece ser una manera de conseguir los valores mínimo y máximo o para pid_t
.
Escuché que el próximo estándar POSIX solo requeriría que encajara en una intmax_t, por lo que el uso de long out está fuera. Lo que realmente hice fue depender de los documentos de la librería C de GNU diciendo que pid_t siempre sería int, y comentándolo. El código usa otras cosas específicas de glibc de todos modos, por lo que este no es un problema real. – Teddy
Ya obtuve una solución "pragmática adecuada", utilizando una suposición no portátil (en un código que nunca fue portátil en primer lugar). Lo que QUISE era una solución realmente portátil, si tal cosa realmente existe. – Teddy