взаимодействие через интерфейс с stdbool.h C++

Как о чем-то вроде этого:

import os


def readlines_reverse(filename):
    with open(filename) as qfile:
        qfile.seek(0, os.SEEK_END)
        position = qfile.tell()
        line = ''
        while position >= 0:
            qfile.seek(position)
            next_char = qfile.read(1)
            if next_char == "\n":
                yield line[::-1]
                line = ''
            else:
                line += next_char
            position -= 1
        yield line[::-1]


if __name__ == '__main__':
    for qline in readlines_reverse(raw_input()):
        print qline

Поскольку файл читается символом по символу в обратном порядке, он будет работать даже на очень больших файлах, если отдельные строки вписываются в память.

13
задан Coding Mash 1 September 2012 в 22:57
поделиться

3 ответа

Я нашел ответ на свой собственный вопрос путем нахождения более совместимой реализации stdbool.h, который совместим со стандартом C99.

#ifndef _STDBOOL_H
#define _STDBOOL_H

#include <stdint.h>

/* C99 Boolean types for compilers without C99 support */
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */
#if !defined(__cplusplus)

#if !defined(__GNUC__)
/* _Bool builtin type is included in GCC */
/* ISO C Standard: 5.2.5 An object declared as 
type _Bool is large enough to store 
the values 0 and 1. */
/* We choose 8 bit to match C++ */
/* It must also promote to integer */
typedef int8_t _Bool;
#endif

/* ISO C Standard: 7.16 Boolean type */
#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

#endif

#endif

Это взято от Библиотека классов Ada проект.

11
ответ дан 2 December 2019 в 00:47
поделиться

Размер не является единственной вещью, которая будет непоследовательна здесь. В C++ bool является ключевым словом, и C++ гарантирует, что bool может содержать значение или 1 или 0 и ничто иное. C не дает Вам эту гарантию.

Тем не менее, если совместимость между C и C++ важна, можно эмулировать C изготовленная на заказ булевская переменная путем определения идентичной для C++ и использования этого вместо встроенного bool. Это будет компромиссом между ошибочным булевым и идентичным поведением между булевской переменной C и булевской переменной C++.

2
ответ дан 2 December 2019 в 00:47
поделиться

Логически, Вы не в состоянии совместно использовать исходный код между C и C++ с конфликтующими объявлениями для bool и сделать, чтобы они связались друг с другом.

единственный способ, которым можно совместно использовать код и ссылку, через посреднический datastructure. К сожалению, от того, что я понимаю, Вы не можете изменить код, который определяет интерфейс между Вашей программой C++ и библиотекой C. Если бы Вы могли, я предложить использовать что-то как:

union boolean {
   bool value_cpp;
   int  value_c;
}; 

//дополнение может быть необходимым в зависимости от порядок байтов

, эффект которого будет состоять в том, чтобы сделать тип данных той же шириной на обоих языках; преобразование в собственный тип данных должно будет быть выполнено в обоих концах. Подкачайте использование bool для булевской переменной в определении библиотечной функции, кода скрипки в библиотеке для преобразования, и Вы сделаны.

Так, то, что Вы оказываетесь перед необходимостью делать вместо этого, создают контейнер между программой C++ и библиотекой C.

Вы имеете:

extern "C" bool library_func_1(int i, char c, bool b);

И необходимо создать:

bool library_func_1_cpp(int i, char c, bool b)
{
   int result = library_func_1(i, c, static_cast<int>(b));
   return (result==true);
}

И теперь называют library_func_1_cpp вместо этого.

0
ответ дан 2 December 2019 в 00:47
поделиться