是否可以从字符串作为用户输入或从文件中以C / C ++(或任何其他语言)创建用户定义的数据类型

时间:2018-07-10 23:06:15

标签: c++ c programming-languages low-level systems-programming

这可能是一个很奇怪的问题,但是我对此颇有好奇。所以就这样...

注意:让我们在这里考虑语言C。

作为程序员,我们通常在源代码中使用适当的名称定义用户定义的数据类型(例如struct)。
假设我有一个程序,其中的结构定义为:

struct Animal {
  char *name;
  int lifeSpan;
};

我也已经开始执行该程序。
现在,我的问题是;
如果我想像程序中上面提到的“动物”一样定义一个名为“植物”的新结构,而不在源代码本身中编写其定义(目前显然不可能),而是从用户输入字符串(或文件输入)。
假设我的程序从名为 file1.txt 的文本文件中获取输入字符串,其内容为:

struct Plant {
  char *name;
  int lifeSpan;
};

我现在想要的是在我的程序中有一个名为“ Plant”的新结构,该结构已经在执行中。该程序应读取文件内容并创建文件中编写的结构,然后将其附加到自身上。

我已经在讨论Declaring a data type dynamically in C++中签出了C ++解决方案,但似乎没有一个非常令人信服的解决方案。

我正在寻找的解决方案是在编译器-链接器-加载器级别,而不是语言本身。
如果有人希望就此分享他们的想法,我将感到非常高兴和感激。
strong>

1 个答案:

答案 0 :(得分:1)

您要问的基本上是“我们可以将C实现为脚本语言吗?”,因为这是编译后可以执行代码的唯一方式。

我知道人们一直在写(主要是在注释中)其他语言也可能,但是C语言是不可能的,因为C是一种编译语言(因此数据类型应在编译时定义)。

但是,据我所知,这实际上是可能的(并且可能不像人们想象的那么难)。

有很多可能的方法(机器代码仿真(VM),JIT编译等)。

一种方法是使用C编译器将C脚本编译为外部动态库(在Windows上为.dll,在Linux上为.so等),然后“加载”已编译的库并执行代码(对于懒惰的人来说,这几乎是JIT编译方法)。


编辑:

如评论中所述,通过使用这种方法,新类型将作为外部库的一部分加载。

原始代码不会知道这种新类型,只有新代码(或库)会“知道”这种新类型并能够正确使用它。

另一方面,我不确定为什么您坚持使用静态类型和编译器-链接器-加载器级别的解决方案。

语言本身(C语言)可以动态地(在执行期间)管理此任务。

例如,考虑Ruby MRI。 Ruby语言支持可以在运行时定义的动态类型...

...但是,这是用C实现的,并且可以使用C中的代码来定义新的模块和类。这些不是静态类型,可以在编译期间进行测试(类型创建和标识在运行时执行)。

这是一个完美的示例,表明C(作为一种语言)可以动态定义“类型”。

但是,这也是一个不好的例子,因为Ruby的方法很慢。批准的自定义设置可以更快,因为它可以避免与您可能不需要的功能(例如继承)相关的大量开销。