it's convoluted but on AVR you can do something like this
FILE f_out;
int sput(char c, __attribute__((unused)) FILE* f) {return !Serial.write(c);}
void setup() {
Serial.begin(115200);
fdev_setup_stream(&f_out, sput, nullptr, _FDEV_SETUP_WRITE); // cf https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaf41f158c022cbb6203ccd87d27301226
stdout = &f_out;
printf("Hello world, the answer is %d (or 0x%02X)!\n", 42, 42);
}
void loop() {}