Где я могу найти документацию 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
Значит, мне это не нравится...
Кто-нибудь знает хороший учебник/блог/ссылку?
Ответы
Ответ 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