2015-07-02 1 views
-1

сообщение код первого:Е() без « п» не работает в libev

#define EV_STANDALONE 1 
#include <stdio.h> 
#include "ev.c" 

ev_timer timeout_watcher; 
struct ev_loop* loop; 
static void timeout_cb (EV_P_ ev_timer *w, int revents) 
{ 
// puts("timeout"); 
    printf("timeout"); 
    ev_timer_again(loop, w); 
} 
int main (void) 
{ 
    printf("hello, world."); 
    loop = EV_DEFAULT; 
    ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); 
    timeout_watcher.repeat = 2.0; 
    ev_timer_start (loop, &timeout_watcher); 
    ev_run (loop, 0); 
    return 0; 
} 

Странная вещь случилась во время работы: хотя printf("hello, world."); был в первую очередь в основной функции, но Бесполезный Не работай. Но если я использую printf("hello, world\n");, все будет работать нормально. Более того, я изменил printf("hello, world"); вместо puts("hello, world");, он также работал. Итак, что же сделал libev для io? Почему «\ n» имеет значение?

+2

вам нужно сбросить буфер с помощью '\ n' – Gopi

ответ

4

Обычно буфер, связанный со стандартным выходом, буферизируется по строке. Содержимое, которое составляет , написано, в буфер не сразу переведено на номер.

A \n, в конце, вызывает вывод flush содержимого буфера.

В качестве альтернативы вы можете использовать fflush(stdout), после printf() без \n, но помните, что это работает только для выходных буферов.

FWIW, чтобы ответить, почему puts()"работает", процитировать страницу человека, (курсив мой)

puts() записывает строку sи символ новой строки на стандартный вывод.

есть неявное поставляется с новой строки puts(), так что буфер очищается.