Return";“数据类型”;在C中

Return";“数据类型”;在C中,c,types,return,C,Types,Return,我想要一个简单的 something Data() { return int; } 或者使用char,long。。。w/e 我该怎么办 我不想返回数字或字符串,我想返回数据类型 我尝试过的另一个选项是使用宏 #define Data int 使用不同的ifs和ELSE,我可以使用它,但是我不能在宏中使用指针,所以这也是一个问题(我需要根据保存在指针中的数字返回数据类型) 以下是我遇到的确切问题,以及我迄今为止所做的工作: //Read/write any type from memo

我想要一个简单的

something Data() {
    return int;
}
或者使用char,long。。。w/e

我该怎么办

我不想返回数字或字符串,我想返回数据类型

我尝试过的另一个选项是使用宏

#define Data int
使用不同的ifs和ELSE,我可以使用它,但是我不能在宏中使用指针,所以这也是一个问题(我需要根据保存在指针中的数字返回数据类型)

以下是我遇到的确切问题,以及我迄今为止所做的工作:

//Read/write any type from memory
#define MemRead(type, offset) (*((type*)(memory + (offset))))
#define MemSet(type, offset, value) (*((type*)(memory + (offset))) = (value))

//Get the index for type (0 - char, 1 - short, 2 - int ...)
#define TypeIndex (MemRead(unsigned short, 0) % 4)
//#if TypeIndex == 0
//#define TYPE char
//#elif TypeIndex == 1
//#define TYPE short
//#endif

//#define TYPE SOMETHING HERE maybe an if-else ...
//#if TypeIndex == 0 doesn't work, because I can't use * in macros

char *memory = NULL;

void memory_init() {

    memory = (char*)ptr;

    //Create a list of pointers
    int numOfPointers = 1, tsize = size - 3 * IntSize - START;
    while (tsize > 64) {
        tsize /= 4;
        MemSet(int, numOfPointers++ * IntSize - 3, 0);
    }

    int typeIndex = 0;
    if (size < power(2, (sizeof(short) * 8) - 1)) {
        typeIndex = 1;
    }
    else if (size < power(2, (sizeof(int) * 8) - 1)) {
        typeIndex = 2;
    }
    else {
        typeIndex = 3;
    }

    MemSet(unsigned char, 0, numOfPointers * 4 + typeIndex);
    MemSet(int, HEADER - IntSize, 0);

    int memAvailable = size - HEADER - 3 * IntSize;
    setBoundaries(HEADER + IntSize, memAvailable, memAvailable);
    MemSet(int, size - IntSize, 0);

    //Set beginning pointer
    MemSet(int, HEADER - IntSize, HEADER + IntSize);

    //Set pointers inside the free block
    MemSet(int, HEADER + IntSize, NULL);
    MemSet(int, HEADER + 2 * IntSize, HEADER - IntSize);
}


int main() {

    char region[500];
    memory_init(region, 500);
}
//从内存中读取/写入任何类型
#定义MemRead(类型,偏移量)(*((类型*)(内存+(偏移量)))
#定义MemSet(类型、偏移量、值)(*((类型*)(内存+(偏移量))=(值))
//获取类型的索引(0-char,1-short,2-int…)
#定义类型索引(MemRead(无符号短,0)%4)
//#如果TypeIndex==0
//#定义类型字符
//#elif TypeIndex==1
//#定义短类型
//#恩迪夫
//#在这里定义类型,可能是if-else。。。
//#如果TypeIndex==0不起作用,因为我不能在宏中使用*
char*memory=NULL;
无效内存_init(){
内存=(char*)ptr;
//创建指针列表
int numOfPointers=1,tsize=size-3*IntSize-START;
而(tsize>64){
tsize/=4;
MemSet(int,numOfPointers++*IntSize-3,0);
}
int-typeIndex=0;
if(尺寸<功率(2,(尺寸(短)*8)-1)){
类型索引=1;
}
否则如果(尺寸<功率(2,(尺寸(整数)*8)-1)){
类型索引=2;
}
否则{
类型指数=3;
}
MemSet(无符号字符,0,numOfPointers*4+typeIndex);
MemSet(int,HEADER-IntSize,0);
int memAvailable=size-HEADER-3*IntSize;
setBoundaries(标头+IntSize、memAvailable、memAvailable);
MemSet(int,size-IntSize,0);
//设置起始指针
MemSet(int,HEADER-IntSize,HEADER+IntSize);
//在空闲块内设置指针
MemSet(int,HEADER+IntSize,NULL);
MemSet(int,HEADER+2*IntSize,HEADER-IntSize);
}
int main(){
半焦区[500];
存储器初始化(区域,500);
}
我获得一些内存空间,将第一个字符设置为一个索引,显示我将使用的数据类型以及列表上有多少指针(每个列表包含不同大小的空闲块),但我无法从类型中获取类型


我可能会在每个函数中使用一个开关,根据内存中的第一个索引处理不同的数据类型,但这很难看,也是我寻找更好解决方案的原因。

如果不选择
开关
或等效结构,你就无法完成你想要的任务。在C中,数据类型不能像Java中的示例那样传递。没有反思。C++有RTI,这可能有帮助,或者模板,但是使用它们会在幕后生成所有需要的机器代码。很明显,您要求的是C解决方案。与后继语言相比,C是一种低级语言

最好的选择是一个函数,它接收所有必要的参数并设置适当的内存量

我相信,在幕后,那些支持您所需的语言也会被分派到不同的代码中。你不需要写所有的行

您还可以在第一个字节中对内存大小进行编码。但请注意,对以下字节的访问将不会对齐。有些体系结构不允许这样做,您将遇到运行时错误

使用工会怎么样?编译器将确保数据类型正确对齐

typedef enum {
    T_CHAR, T_SHORT, T_INT,
} TYPE;

typedef struct {
    TYPE t;
    union {
        char c;
        short s;
        int i;
    }
} ENTRY;

void memory_init(ENTRY* memory) {
    // prepare as you like
    switch (memory.t) {
    case T_CHAR:
        memory.c = value;
        break;
    case T_SHORT:
        memory.s = value;
        break;
    case T_INT:
        memory.i = value;
        break;
    default:
        // error handling...
        break;
    }
}

因此,我不需要尝试获取类型上的宏,只需使用函数,该函数将在标志设置为的任何类型中写入所需的数字:

void MemRead(int offset) {
    switch(flag something something) {
        case 1 //for char
        case 2 //for short etc etc
    }
}

就这么简单

你不能。为什么要这样做?@SMAEL函数要么返回对象,要么返回类型为void。这是一个。你需要解决的实际问题是什么?为什么您认为您需要能够返回一个类型?另外,请花一些时间阅读,以及.Re“我不想返回数字或字符串,我想返回数据类型”,没有这样的事情。“数据类型”不是一种值类型,因此您不能将函数声明为返回“数据类型”类型的值,也不能返回“数据类型”类型的值。您认为通过使用“动态大小”整数得到的任何压缩都可能会被用于跟踪其大小的额外字节所抵消。只需将大小存储为
size\t
(unsigned int或long)即可。否则,这是一个微观优化,要正确工作非常复杂。TBH,我不认为这基本上不是每个函数中都有一个开关的解决方案(我试图避免(这是可能的,但不是很好))。添加了更多的代码来显示,我只使用MemSet和MemRead,所以对于每种数据类型,它会在低级别上复制整个代码几次,没错,它的工作原理类似。但正如我和其他人已经说过的,如果你试图以你展示给我们的方式管理记忆,你是在呼吁灾难,因为UB我的回答包括一些提示和一个类型安全建议,这就是区别。感谢您的帮助,我将研究内存对齐问题,并就此与我的讲师对质。所以,没有真正的方法来做我的好(但对齐明智的错误)的方式,对吗?(添加“如果我也尝试工作”)好吧,即使你让它与你当前的一组编译器和目标一起工作,让我们假设你找到了一个标准的一致性方法,它仍然是黑客和难以掌握的。如果一个年轻的学徒努力达到精通程度,他/她不应该学习做什么源代码主要由人类阅读,这些人应该理解您的意图。请相信编译器会尽其所能将其翻译成最佳的机器代码。谢谢你的帮助,我可能在一两年内理解你想说的话,但现在不行,这是肯定的。我想我现在不会得到这对夫妇的加分(或者d)