对不起,如果这个问题用错了词-我不知道该用什么词来表达我的要求!:)
比方说,你有一些简单的C程序,比如:
#include <stdio.h>
int main()
{
int a=2;
printf("Hello World %d\n", a);
return 0;
}
通常,这必须保存在一个文件中(例如,
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>
换句话说,我希望能够交互地执行单独的c命令(我猜这将代表动态编译的排序?)。最初,我被C shell(
csh
)的名字误导了,但我认为它不能动态执行c命令。所以,首先,我想知道是否有可能说服,比如说,
gdb
以这种方式执行?如果没有,还有什么可以让我做类似的事情(可能是一些特殊的外壳)?至于上下文-我有一些代码,我有问题,疑难解答之间的结构等指针;这里的方式gdb can printout structs工作得很好-但是,要隔离问题,我必须做新的源文件,粘贴数据,编译和调试一遍。在这种情况下,我更希望能够在某种shell中粘贴几个结构(以及它们的初始化命令),然后,使用直接在shell上键入的
printf
(甚至更好,类似于gdb
'sprint
)进行检查。只是为了记录-我真的不相信这样的事情真的存在,但我想我会问无论如何:
提前谢谢你的回答,
干杯!
_
_
编辑:我有点忙,所以还没来得及复习所有的答案以便接受(抱歉:);只是想添加一点评论:“解释与机器代码”;或者正如@doron所说:
C/C++源交互运行的问题是
编译器无法对代码执行逐行解释。
我完全知道这一点——但是让我们想象一下一个命令行应用程序(甚至可以是一个解释的应用程序),它给您一个带有命令行界面的提示。首先,假设这个应用程序在内存中生成这个简单的“文本文件”:
@@HEADER@@
int main()
{
@@MAIN@@
return 0;
}
然后,应用程序只需等待在提示下输入文本,然后按enter键;在新行上:
应用程序检查:
如果该行以
#define
或#include
开头,则将其添加到临时文件中@@HEADER@@
行的下面,但在int main()
行的上面在临时文件中,任何其他内容都在
@@MAIN@@
行下面,但在return 0;
行上面temp文件被删除
@@HEADER@@
和@@MAIN@@
行,并以temp.c
格式保存到磁盘。调用
gcc
来编译temp.c
并生成temp.out
可执行文件如果失败,通知用户,退出
调用
gdb
运行temp.out
可执行文件,并在return 0;
行设置断点如果失败,通知用户,退出
执行返回到提示;用户输入的下一个命令实际上被传递到
gdb
(这样用户可以使用命令如p variable
检查)-直到用户按下,例如,CTRL + 1退出gdb
退出1,控制返回到我们的应用程序,它再次等待下一行代码。等
(随后的代码行条目保存在临时文件中-放在同一类别的最后一个条目下面)
显然,我不希望能够将整个linux内核代码粘贴到这样的应用程序中,并且希望它能够工作:)但是,我希望能够粘贴到几个
gdb
s中,并检查语句的结果,例如:char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88;
…因此,我确信使用什么样的语法是正确的(这通常是我搞砸的)——不需要重新构建和调试整个软件的开销,只需要弄清楚是否应该在星号之前或之后移动右括号(当然,在这样的操作不会引起编译错误的情况下)。
现在,我不确定像上面这样简单的应用程序体系结构可能产生的整个问题范围。但是,这是一个例子,它简单地指出,类似于“C外壳”(对于相对简单的会话/程序)的东西在概念上是可行的,也可以使用
struct
和gcc
——与“机器代码”和“解释”语言之间没有任何严重的冲突,否则,将严格区分“机器代码”和“解释”语言。
最佳答案
有C个口译员。
找ch或cint。
关于c - Linux C:类似于Shell的环境-用于单独执行-C命令? (C口译员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226156/