Linux C:类似Shell的环境 - 用于单独执行 - C命令?(C口译员)

sda*_*aau 0 c linux shell environment gdb

对不起,如果问题措辞错误 - 我不知道我要求的正确的词!:)

说,你有一些简单的C程序,如:

#include <stdio.h>

int main()
{
   int a=2; 
   printf("Hello World %d\n", a);
   return 0;
} 
Run Code Online (Sandbox Code Playgroud)

通常,这必须保存在文件中(例如hello.c); 然后我们运行gcc源文件并获取可执行文件 - 如果我们编译了调试信息,那么我们可以使用gdb可执行文件,逐步执行代码行,并检查变量.

我想拥有的,基本上是某种"C"shell - 类似于Python shell; 从某种意义上说,我可以在一个文件(脚本)中有一系列Python命令 - 或者我可以在shell中粘贴相同的命令,然后它们将执行相同的命令.关于上面的简单程序,这是我希望能够做到的(C>代表想象的提示):

C> #include <stdio.h>
(stdio.h included)
C> int a=2;
C> printf("Hello World %d\n", a);
Hello World 2

C> 
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望能够以交互方式执行单独的C命令(我猜这会代表各种类型的动态编译?).最初我被C shell(csh)的名称误导了- 但我不认为它能够动态执行C命令.

所以,首先,我想知道是否有可能以某种方式说服gdb以这种方式执行?如果没有,还有什么可以让我做类似的事情(也许是一些特殊的外壳)?

至于上下文 - 我有一些代码,我有问题排除结构之间的指针等; 这里gdb打印输出结构的方式非常好 - 但是,为了隔离问题,我必须制作新的源文件,粘贴数据,重新编译和调试.在这种情况下,我宁愿有某种壳的贴几个结构(和它们的初始化命令)的可能性-然后,检查使用printf(甚至更好,一个类似于gdbprint)直接输入上壳.

只是为了记录 - 我真的没有说服这样的东西真的存在; 但我想我还是会问:)

提前感谢任何答案,
干杯!  
 

编辑:我有点忙,所以没有时间审查所有的答案还可以接受(对不起:)); 只是想添加一点评论:" 解释与机器代码 "; 或者如@doron所说:

以交互方式运行C/C++源的问题是编译器无法对代码执行逐行解释.

我完全清楚这一点 - 但是让我们想象一下命令行应用程序(甚至可以是一个解释的应用程序),它会给你一个命令行界面的提示.首先,让我们假设这个应用程序在内存中生成这个简单的"文本文件":

@@HEADER@@

int main()
{
    @@MAIN@@

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

然后,应用程序只需等待在提示符下输入文本,然后按ENTER键; 并在新的一行:

  • 申请检查:
    • 如果该行以#define或开头#include,则将其添加到临时文件中@@HEADER@@- 但int main()在行上方-
    • 其他任何东西,在临时文件中低于@@MAIN@@行 - 但return 0;在行上方
  • 临时文件被剥离@@HEADER@@并删除@@MAIN@@行,并保存到磁盘中temp.c
  • gcc被调用来编译temp.c并生成temp.out可执行文件
    • 如果失败,通知用户,退出
  • gdb调用以运行temp.out可执行文件,并在该return 0;行 设置断点
    • 如果失败,通知用户,退出
  • 执行返回到提示符; 用户输入的下一个命令,实际上是传递给gdb(因此用户可以使用命令p variable来检查) - 直到用户按下,例如,Ctrl + 1退出gdb
  • Ctrl + 1 - gdb退出,控制返回到我们的应用程序 - 它等待下一个代码行重新等等
    • (后续代码行条目保存在临时文件中 - 位于同一类别的最后一个条目下面)

显然,我不希望能够将整个Linux内核代码粘贴到这样的应用程序中,并期望它能够工作:)但是,我希望能够粘贴几个structs,并检查声明的结果,如:

char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88; 
Run Code Online (Sandbox Code Playgroud)

...所以我确定使用的正确语法是什么(通常是我搞砸了) - 没有重建和调试整个软件的开销,只是为了弄清楚我是否应该移动右括号在星号之前或之后(当然,当这样的动作没有引起编译错误的情况下).

现在,我不确定上述简单应用程序架构可能产生的整个问题范围.但是,这是一个例子,它只是指出像"C shell"(对于相对简单的会话/程序)这样的东西在概念上是可行的,通过使用gccgdb- 没有任何严重的冲突,否则,严格区分'机器代码'和'解释'语言.

bud*_*rot 6

有C口译员.
寻找Ch或CINT.


pmg*_*pmg 5

编辑:找到一个新的(未经测试的)东西,似乎是OP想要的东西

C-REPL

或者只是像在城市街道上驾驶Ferarri一样使用它.


微小的C编译器

  • [...许多功能,包括]
  • 支持C脚本:只需在C源代码的第一行添加"#!/ usr/local/bin/tcc -run",然后直接从命令行执行.