Intereting Posts
Как передать дескриптор дочернему процессу opencv, отображающий переменную на видео clrscr () не работает, getch () работает. Зачем? Возrotation массива из функции C Есть ли способ для вызова определенного IP-адреса с помощью C? Есть ли способ принудительно сохранить переменную в кеше в C? Тип массива имеет неполный тип элемента Предупреждение компилятора C Неизвестная escape-последовательность ‘\.’ использование регулярного выражения для программы c Зачем использовать select () вместо sleep ()? Рекомендации по шифрованию / расшифровке скриптов изящно? добавление текущего / выбранного пользователя в группу Анализ / просмотр файла растрового изображения в C Правильное использование malloc () и free () в c Гибридная программа (.asm + .cpp): изменить код небольшой математической программы, чтобы включить ввод с плавающей запятой Ответы команды AT (понимание порядка выполнения кода на Arduino)

Автоматическое создание кода C из заголовка

Я хочу генерировать пустые реализации процедур, определенных в файле заголовка. В идеале они должны возвращать NULL для указателей, 0 для целых чисел и т. Д., А также в идеальном мире также печатать на stderr, вызванную функцией.

Мотивацией для этого является необходимость внедрения оболочки, которая адаптирует подмножество сложного, существующего API (файл заголовка) к другой библиотеке. Лишь небольшое количество процедур в API необходимо делегировать, но не ясно, какие из них. Поэтому я надеюсь использовать итеративный подход, в котором я бегу против этой автоматической сгенерированной оболочки, видеть, что называется, реализовать это с делегированием и повторить.

Я вижу Автоматически генерировать C ++-файл из заголовка? но ответы кажутся специфичными для C ++.

Итак, для людей, которым нужен вопрос, прописанный простыми словами, как я могу автоматизировать создание такой реализации, учитывая заголовочный файл? Я бы предпочел использовать существующий инструмент – мое текущее лучшее предположение о простом решении – использование pycparser.

обновление Спасибо, ребята. Оба хороших ответа. Также опубликовал мой текущий хак.

    Инструменты моделирования UML способны генерировать реализацию по умолчанию на выбранном языке. Как правило, существует поддержка импорта исходного кода (включая заголовки C). Вы можете попытаться импортировать заголовки и генерировать исходный код. Я лично имею опыт работы с Enterprise Architect и поддерживаю обе эти операции.

    поэтому, я собираюсь отметить предложение ea как «ответ», потому что я думаю, что это, вероятно, лучшая идея в целом. хотя я думаю, что предложение cmock будет очень хорошо работать в tdd-подходе, где развитие библиотеки было вызвано ошибками тестирования, и я могу в конечном итоге попробовать это. но на данный момент мне нужен более быстрый + более грязный подход, который работает в интерактивном режиме (рассматриваемая библиотека представляет собой динамически загружаемый плагин для другого, интерактивного, программного обеспечения, и я пытаюсь перестроить последовательность вызовов api …)

    поэтому то, что я закончил, было написанием сценария python, который вызывает pycparse. я включу его здесь, если он поможет другим, но он вовсе не является общим (предполагает, что все функции возвращают int, например, и имеют взломы, чтобы избежать func defs внутри typedefs).

    from pycparser import parse_file from pycparser.c_ast import NodeVisitor class AncestorVisitor(NodeVisitor): def __init__(self): self.current = None self.ancestors = [] def visit(self, node): if self.current: self.ancestors.append(self.current) self.current = node try: return super(AncestorVisitor, self).visit(node) finally: if self.ancestors: self.ancestors.pop(-1) class FunctionVisitor(AncestorVisitor): def visit_FuncDecl(self, node): if len(self.ancestors) < 3: # avoid typedefs print node.type.type.names[0], node.type.declname, '(', first = True for param in node.args.params: if first: first = False else: print ',', print param.type.type.names[0], param.type.declname, print ')' print '{fprintf(stderr, "%s\\n"); return 0;}' % node.type.declname print '#include "myheader.h"' print '#include ' ast = parse_file('myheader.h', use_cpp=True) FunctionVisitor().visit(ast) 

    Предостережение: это не отредактированный ответ, поскольку у меня не было никакого опыта с ним.

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

    На странице проекта предлагается генерировать код из заголовка. Затем вы можете взять код и настроить его.