Подтвердить что ты не робот

Где я могу найти документацию c-repl?

Я только что встретил Ubuntu c-repl, который предоставляет интерфейс REPL для программирования на C. Большой! Это отлично подходит для поиска фрагментов и идей, а также для интуитивного использования. Я люблю это. Но документации нет вообще, и я хотел бы узнать больше о том, как управлять ею.

Пример:

> int foo( double x ) { return x+0.5;}
> foo(5.5);
> int x = foo(5.5);
> x
p x
$1 = 6

Все идет хорошо, но затем:

> #include <stdlib.h>
<stdin>:1:22: warning: extra tokens at end of #include directive

Значит, мне это не нравится... Кто-нибудь знает хороший учебник/блог/ссылку?

4b9b3361

Ответ 1

В соответствии с README файл в репозитории git, он использует gcc для компиляции каждой строки кода и gccxml для include директивы.

Как это работает

Подход на удивление прост: для каждой введенной строки кода мы скомпилируйте общий объект в фоновом режиме. Если компиляция завершается успешно, объект загружается в дочерний процесс через dlopen(). Разбор C #includes используется gccxml. (К сожалению, я не могу понять, как использовать gccxml для анализа пользовательского ввода и из-за сложности анализа C входной парсер в настоящее время взломан и эвристичен.)

Сообщение об ошибке - это та же формулировка, что и у gcc (хотя и не с этим вводом). Возможно, попробуйте без пробелов.

Ответ 2

README, упомянутый в ответе, кажется, теперь ушел (c-repl страница все еще жива); поэтому я подумал, что просто упомянул, что:

  • Команды начинаются с точки
  • Вы получаете помощь с .help
  • Вы не '#include "..."', вместо этого используете '.h "..."'

Ниже представлен журнал командной строки, который может быть полезен...

Ура!

$ c-repl
> .help
Type C statements and declarations as you would in a normal program.
Type a variable name by itself to see its value.

Commands start with a . and are as follows:
  d      toggle debug mode.
  g      "g foobar": run an arbitrary command through gdb.
  h      "h foo.h": bring in a C header.
  help   show help on commands.
  l      "l m": bring in a C library.
  s      cause a segfault to let crepl attempt to recover.
  t      test if the repl is ok by running a printf through it.
> .h string.h
> char p1[50]
> strcpy(p1, "hello")
> printf("%s\n",p1)
hello
> .t
repl is ok


> .d
debug is on

> .t
#include <stdio.h>
#include "string.h"
extern char p1[50];
void dl5() {
  #line 1
  printf("repl is ok\n");
}
gcc -xc -g -fPIC -shared -o /tmp/c-repl.nz6I5Zls4o/dl5.so  -
repl is ok

> char p1[50]
#include <stdio.h>
#include "string.h"
extern char p1[50];
char p1[50];
void dl6() {
}
gcc -xc -g -fPIC -shared -o /tmp/c-repl.nz6I5Zls4o/dl6.so  -

> strcpy(p1, "hello")
#include <stdio.h>
#include "string.h"
extern char p1[50];
extern char p1[50];
void dl7() {
  #line 1
  strcpy(p1, "hello");
}
gcc -xc -g -fPIC -shared -o /tmp/c-repl.nz6I5Zls4o/dl7.so  -

> printf("%s\n",p1)
#include <stdio.h>
#include "string.h"
extern char p1[50];
extern char p1[50];
void dl8() {
  #line 1
  printf("%s\n",p1);
}
gcc -xc -g -fPIC -shared -o /tmp/c-repl.nz6I5Zls4o/dl8.so  -
hello

> ^C /usr/bin/c-repl:185:in `readline': Interrupt
    from /usr/bin/c-repl:185:in `input_loop'
    from /usr/bin/c-repl:184:in `loop'
    from /usr/bin/c-repl:184:in `input_loop'
    from /usr/bin/c-repl:203

 

EDIT: Вот фрагмент с библиотеками; Я не могу заставить статическую привязку работать - я думаю, причина в том, что командная строка c-repl gcc по умолчанию настроена на компиляцию статических объектов (см. Ниже в журнале терминалов). Обратите внимание на использование LIBRARY_PATH (not LD_LIBRARY_PATH!), Чтобы проинструктировать компоновщика, где искать файлы (ссылка c - Сообщить ld, где искать каталоги через переменную среды). Я также нашел:

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

####################################
# generate library source file 

$ cat > mylib.c <<"EOF"

#include <stdio.h>

void my_func (void)
{
  // don't forget \n here; else c-repl will gulp the text
  printf ("this is my_func speaking\n");
}

EOF

####################################
# cannot get it to work with static linking:

$ gcc -c mylib.c
$ ar rs libmylib.a mylib.o
ar: creating libmylib.a

$ LIBRARY_PATH=$PWD:$LIBRARY_PATH c-repl
> .l mylib
> my_func()
/usr/lib/c-repl/child: symbol lookup error: ./dl1.so: undefined symbol: my_func
??? wait finished; 2853 #<Process::Status: pid=2853,exited(127)>
resuming.
> ^C ... Interrupt


$ LIBRARY_PATH=$PWD:$LIBRARY_PATH LD_LIBRARY_PATH=$PWD:LD_LIBRARY_PATH c-repl
> .l mylib
> my_func()
/usr/lib/c-repl/child: symbol lookup error: ./dl1.so: undefined symbol: my_func
??? wait finished; 3257 #<Process::Status: pid=3257,exited(127)>
resuming.
> ^C ... Interrupt

# cleanup files:
$ rm libmylib.a mylib.o


####################################
# dynamic linking (shared object) seems to work: 

gcc -c -fpic mylib.c
gcc -shared -o libmylib.so mylib.o


$ LIBRARY_PATH=$PWD:$LIBRARY_PATH c-repl
> .l mylib
> my_func()
this is my_func speaking
> ^C ... Interrupt


################
# (dynamic, with debug output): 

$ LIBRARY_PATH=$PWD:$LIBRARY_PATH c-repl
> .d
debug is on
> .l mylib
> my_func()
#include <stdio.h>
void dl1() {
  #line 1
  my_func();
}
gcc -xc -g -fPIC -shared -o /tmp/c-repl.ocTfWQeXdh/dl1.so -lmylib -
this is my_func speaking
> ^C ... Interrupt