将任何数据类型/对象作为参数传递以确定其大小

passing any data type / object as parameter to determine it's size

本文关键字:参数传递 数据类型 任何 对象      更新时间:2023-10-16

我很确定我已经在 C 语言中得到了问题的答案,但不确定 Cpp。

typedef struct strXXX {
    uint16_t member1;
    uint8_t member2;
    // ...
} XXX;
XXX tst;
void some_init_func(void * obj, uint16_t sz)
{
    obj = &tst;
    size = sz;
}

调用some_init_func时,必须给出大小:

sizeof(tst)

有没有办法将任何对象或数据类型传递给some_init_func,并确定函数中对象的大小?

我确实认为这在 C/CPP 中是不可能的,因为您可以传递指针,但无法从指针确定对象本身的大小,
但我想知道你们中的一些硬程序员是否在这些语言中找到了解决这种缺乏的解决方法?

。除了这种宏(它不会一直起作用,因为大小参数可能不在对象地址之后(:

#define PASS_OBJ(obj)    &obj, sizeof(obj)

感谢您的帮助!

在C++中,你可以只使用模板函数:

template <typename T> void some_init_func(T* obj)
{
    const size_t size = sizeof(T);
    // ...
}

我怀疑这是否可能,特别是因为 C/C++ 中存在数据的填充。 sizeof()存在是有原因的。

在C++中,您可以将函数转换为模板函数。这将强制在调用类型时传递类型。您可以使用函数内部的sizeof()来计算该类型的传递对象的大小。

基本上,当对象大小作为void *类型传递时,不可能获取对象大小,因为对象类型可以隐式转换为所需的任何对象。

但是,如果要谈论C++ - 抽象类是解决方案:

class Template {
public:
  virtual void method1()=0;
  virtual void method2(void *)=0;
};

在这种情况下,您不仅可以传递void *类型对象,而是传递派生对象Template *其中method2可以在以后的实现中采用通用void *参数,并将其转换为具有已知大小的所需对象类型。