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

Is it possible to create a user-defined datatype in a language like C/C++(or maybe any) from a string as user input or from file

本文关键字:用户 语言 输入 定义 数据类型 创建 字符串 文件 任何 C++ 是否      更新时间:2023-10-16

这可能是一个非常奇怪的问题,但我的好奇心在这个问题上受到了很大的打击。所以它开始了。。。

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

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

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

而且我已经开始执行这个程序了
现在,我的问题是
如果我想在程序中定义一个名为"Plant"的新结构,就像上面提到的"Animal"一样,而不在源代码中写入它的定义(目前显然不可能(,而是在运行时从用户输入字符串(或文件输入(,该怎么办。
假设我的程序从一个名为file1.txt的文本文件中获取输入字符串,该文件的内容为:

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

我现在想要的是在我的程序中有一个名为"Plant"的新结构,它已经在执行中了。程序应该读取文件内容,创建一个在文件中写入的结构,并在运行时将其附加到自己身上

我在讨论中查看了C++的解决方案在C++中动态声明数据类型,但它似乎没有一个很有说服力的解决方案

我正在寻找的解决方案是在编译器链接器加载程序级别,而不是从语言本身
如果有人期待分享他们对此的想法,我将非常高兴和感谢

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

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

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

有许多可能的方法(机器代码模拟(VM(、JIT编译等(。

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


编辑:

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

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

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

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

以Ruby MRI为例。Ruby语言支持可以在运行时定义的动态类型。。。

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

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

然而,这也是一个糟糕的例子,因为Ruby的方法很慢。自定义批准的速度要快得多,因为它可以避免与您可能不需要的功能(如继承(相关的巨大开销。