Почему код Rust с использованием printf в цикле из C не отображает вывод, а использование std :: cout в цикле из C ++ делает? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую Rust для вызова функции C с циклом (for или while), который использует функцию printf для отображения чего-либо, но функция C не отображает никакого вывода из printf.

код C:

#include <stdio.h>
#include <unistd.h>

void print_c() {
  int s = 3;
  while (1) {
    printf("%d\n", s);
    sleep(1);
  }
}

Однако при использовании C ++ вывод успешно генерируется.

C ++ код:

#include <iostream>
#include <stdint.h>
#include <unistd.h>

extern "C" {
  int print_it(int32_t num) {
    while (1) {
        std::cout << num << std::endl;
        sleep(1);
    }
  }
}

C упакован как общая библиотека с именем "cthread". C ++ называется "cppthread".

Это Rust, вызывающий библиотеку C:

#[link(name = "cthread")]
extern "C" {
    fn print_c();
}

fn main() {
    unsafe { print_c() };
}

И Rust вызывает библиотеку C ++:

#[link(name = "cppthread")]
extern "C" {
    fn print_it();
}

fn main() {
    unsafe { print_it() };
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Ваши версии C и C ++ не эквивалентны.

Ваша версия C просто печатает число и перевод строки. Он не выполняет явную очистку (которая затем предоставляется различным уровням стека ввода-вывода, чтобы решить, когда делать & mdash; почти наверняка, учитывая ваши sleep(1), это займет некоторое время!).

Ваша версия C ++ печатает число, затем (через endl) одновременно печатает новую строку и сбрасывает. Вот почему вы всегда видите результат сразу.

os << endl - это os << '\n' << flush.

Сделать вашу версию на C так же просто, используя fflush:

#include <stdio.h>
#include <unistd.h>

void print_c() {
  int s = 3;
  while (1) {
    printf("%d\n", s);
    fflush(STDOUT);
    sleep(1);
  }
}

Эта проблема не имеет ничего общего с Rust.

0 голосов
/ 01 ноября 2018

Я попробовал вашу версию C, и она работала для меня в macOS. Поскольку вы не указали нам свою операционную систему, трудно понять, является ли это чем-то специфичным для платформы. Попробуйте добавить fflush(stdout) после вашего printf.

#include <stdio.h>
#include <unistd.h>

void print_c() {
  int s = 3;
  while (1) {
    printf("%d\n", s);
    fflush(stdout); // This makes sure stdout is not being buffered.
    sleep(1);
  }
}

Что касается вашей версии C ++, у нее есть свои проблемы в коде Rust.

Так как ваша версия C ++ возвращает int и принимает int в качестве параметра. Вы должны определить свое внешнее определение, чтобы показать это. Поскольку вы на самом деле берете int32_t, я использовал i32 для типа. Но вы возвращаете int (примечание: вы на самом деле ничего не возвращаете в своем коде). , и поскольку размер int может отличаться на разных платформах, лучше использовать libc::c_int

extern crate libc;
use libc::c_int;

#[link(name = "cppthread")]
extern {
    fn print_c(num: i32) -> c_int;
}

fn main() {
    unsafe { print_c(10) };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...