Дескриптор ошибки и обычный вывод на консоль совпадают.Или, скорее, они указывают на одно и то же окно консоли.Когда вы изменяете цвет консоли, он применяется ко всему тексту, написанному после этого, поэтому вам нужно будет изменить цвет непосредственно перед выводом.Если вы не хотите делать это для каждого выводимого текста, упакуйте вызовы в отдельную функцию:
#include <windows.h>
#include <stdio.h>
// global vars (better pack it in a class)
// initialize both to normal white color
#define FOREGROUND_WHITE (FOREGORUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN)
int g_console_out_color = FOREGROUND_WHITE;
int g_console_err_color = FOREGROUND_WHITE;
HANDLE g_console_out_handle = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_console_err_handle = GetStdHandle(STD_ERROR_HANDLE);
void SetConsoleOutColor(int color){
g_console_out_color = color;
}
void SetConsoleErrColor(int color){
g_console_err_color = color;
}
void PrintOut(const char* format, ...){
SetConsoleTextAttribute(g_console_out_handle, g_console_out_color);
va_list args;
va_start(args, str);
fprintf(stdout, format, args);
va_end(args);
// set color back to normal
SetConsoleTextAttribute(g_console_out_handle, FOREGROUND_WHITE);
}
void PrintErr(const char* format, ...){
SetConsoleTextAttribute(g_console_err_handle, g_console_err_color);
va_list args;
va_start(args, str);
fprintf(stderr, format, args);
va_end(args);
// set color back to normal
SetConsoleTextAttribute(g_console_err_handle, FOREGROUND_WHITE);
}
int main(void){
PrintOut("%s\n", "out");
PrintErr("%s\n", "err");
}