Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量类型本身就是变量的语言?_C_Programming Languages - Fatal编程技术网

C 变量类型本身就是变量的语言?

C 变量类型本身就是变量的语言?,c,programming-languages,C,Programming Languages,我将使用C作为示例语言来说明我的意思 结构父级 { int x; chary; }; 结构子对象 { chary; int x; }; int foo(无效*s,类型obj_类型) { //使用“类型”变量进行转换 obj_类型obj=(obj_类型)s; 返回obj->x; } int main(int argc,字符**argv) { 类型obj_type=struct parent*; 结构父p; p、 x=0; //返回0 foo(p&p,obj_类型); 对象类型=结构子对象*; 结构

我将使用C作为示例语言来说明我的意思

结构父级 { int x; chary; }; 结构子对象 { chary; int x; }; int foo(无效*s,类型obj_类型) { //使用“类型”变量进行转换 obj_类型obj=(obj_类型)s; 返回obj->x; } int main(int argc,字符**argv) { 类型obj_type=struct parent*; 结构父p; p、 x=0; //返回0 foo(p&p,obj_类型); 对象类型=结构子对象*; 结构子c; c、 x=5; //返回5 foo&c,obj_类型); 返回0; } 正如您所看到的,对于这两个结构,x被放置在内存中的不同位置,所以我不能在内存中只使用静态偏移量。这在C语言中是可能的吗(一些我想不出的预处理器魔法)?我假设没有,但是有没有任何语言可以将类型本身用作变量?我想探讨一下以类型为中心的编程的含义


编辑:正如itsme86所指出的,C#具有类型类的这种能力。另外,C++概念和Haskell类型类是有意义的。

< P>如果你把类型安全放在后面,你可以使用<代码>偏移< <代码>(从<代码> STDDEF.H./C>):


但是我并不推荐它。

在Java中,您可以通过反射API访问类型信息。以下是一个例子:

package stackoverflow;

import java.util.Arrays;

public class MyClass {
    public static void main(String[] args) {
        MyClass myInstance = new MyClass(42, "foo");
        Class<MyClass> myClass = MyClass.class;
        System.out.println(myInstance instanceof MyClass);
        System.out.println(myInstance.getClass().equals(myClass));
        System.out.println(myClass.getName());
        System.out.println(Arrays.toString(myClass.getDeclaredFields()));
        System.out.println(Arrays.toString(myClass.getDeclaredMethods()));
    }

    private final int i;
    private final String s;

    public MyClass(int i, String s) {
        this.i = i;
        this.s = s;
    }

    public int getI() {
        return i;
    }

    public String getS() {
        return s;
    }
}
如您所见,
MyClass.class
是泛型类型的对象,它提供了对类
MyClass
信息的访问。也可以通过类的任何实例检索此对象,请参见
myInstance.getClass()
。我举了几个例子来说明什么是可访问的。还可以通过类的
class
对象创建类的新实例。有关更多信息,您可能还希望查看包的Javadoc


请注意,这只允许您访问这些信息。例如,它不允许您更改现有实例的类型,我认为这是一件好事。但是,这在Python中似乎是可能的:


我想我不明白你的要求。您是否需要
返回obj->x
返回
int
?是。不过,根据类型运算符的不同,obj->x可能位于obj的地址,也可能是1字节以外的偏移量(给定struct设置)。我想要的是一个可以用来识别类型而不是值的变量。您正在寻找的特性是。它在一些面向对象的语言中可用,但在C语言中不可用(尽管您可以通过添加
type
成员作为所有结构的第一个成员来破解)。@user3386109这部分是我想要的,但是变量可以在任何语言中保存这些值吗?例如,C++支持DyrimeSkyCube,但它看起来不允许我创建一个新的变量,其值是Type C,它绝对具有这个能力。有一个
Type
类,它有关于它所指类型的各种信息。它还可以根据这些信息在运行时创建一个这种类型的新对象,这绝对是获得我想要的一些有趣结果的一种方法。然而,我问这个问题的主要原因是因为我想看看变量类型是否可以包含类型作为其值,即“type t=int”。这在任何语言中都是可能的吗?
package stackoverflow;

import java.util.Arrays;

public class MyClass {
    public static void main(String[] args) {
        MyClass myInstance = new MyClass(42, "foo");
        Class<MyClass> myClass = MyClass.class;
        System.out.println(myInstance instanceof MyClass);
        System.out.println(myInstance.getClass().equals(myClass));
        System.out.println(myClass.getName());
        System.out.println(Arrays.toString(myClass.getDeclaredFields()));
        System.out.println(Arrays.toString(myClass.getDeclaredMethods()));
    }

    private final int i;
    private final String s;

    public MyClass(int i, String s) {
        this.i = i;
        this.s = s;
    }

    public int getI() {
        return i;
    }

    public String getS() {
        return s;
    }
}
true
true
stackoverflow.MyClass
[private final int stackoverflow.MyClass.i, private final java.lang.String stackoverflow.MyClass.s]
[public int stackoverflow.MyClass.getI(), public java.lang.String stackoverflow.MyClass.getS(), public static void stackoverflow.MyClass.main(java.lang.String[])]