Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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+中类的大小+;C代码中的代码作为编译时常量_C++_C - Fatal编程技术网

C++ C+中类的大小+;C代码中的代码作为编译时常量

C++ C+中类的大小+;C代码中的代码作为编译时常量,c++,c,C++,C,我需要C代码中的编译时间常数: #define CLASSFROMCXX_SIZE /* compile time constant /* 在C++代码中,我可以写: #define CLASSFROMCXX_SIZE sizeof(ClassFromCXX) 但是我不能在C代码中使用ClassFromCXX。我可以编写一个返回sizeof(ClassFromCXX)的函数,但我需要的是编译时常量,而不是一些运行时值 不生成代码就可以实现吗?我可以使用哪些现有的代码生成工具来实现这一点 这是

我需要C代码中的编译时间常数:

#define CLASSFROMCXX_SIZE /* compile time constant /*
在C++代码中,我可以写:

#define CLASSFROMCXX_SIZE sizeof(ClassFromCXX)
但是我不能在C代码中使用ClassFromCXX。我可以编写一个返回sizeof(ClassFromCXX)的函数,但我需要的是编译时常量,而不是一些运行时值

不生成代码就可以实现吗?我可以使用哪些现有的代码生成工具来实现这一点

这是一个理论问题,但作为例子:我使用C++中的C++编写的一些库,所以我在C中编写包装器。有关问题是:


但是它使用堆分配/堆栈分配。

您想要的根本不可能。C不理解C++类定义,也不理解C++对象布局。因此,C编译器无法计算C++类的大小……/p> 我认为你最好的办法是扭转这个问题。虽然C不理解C++类,但是C++确实理解C结构(在某种程度上),并且可以与C链接,而不是C++类,定义了C结构以及在该类型对象上操作的函数。这些函数可以在C和C++中实现和使用:

\ifdef\uuucplusplus
外部“C”{
#恩迪夫
类型定义结构
{
INTA;
浮动p[3];
}某物;
void SomeThing_构造(SomeThing*obj,int arg);
使某物无效(某物*obj);
使某物无效(const SomeThing*obj,float x);
#ifdef_uucplusplus
}
#恩迪夫
在这个基本接口周围添加一个包装类,以在C++的边上使用。
除非绝对必要,否则我会尽量避免走代码生成的道路。为了计算C++类的大小,代码生成意味着它必须在某个时候调用C++编译器。最好是用于编译其余代码的编译器,其标志与用于编译其余代码的标志完全相同(C++对象布局通常不仅取决于编译器,甚至可能受某些编译器标志的影响)。您需要编写一个工具来生成包含所需代码的头文件。您需要将此工具的编译和运行集成到构建系统中。将生成的头文件视为一个依赖项,该依赖项将像库一样构建。您将如何做这完全取决于您的构建系统。在Makefile中,您只需添加一个目标来构建头文件。如果使用CMake生成buildsystem,则可以使用添加可执行文件来添加工具,然后使用定义如何生成头文件,然后将生成的头文件添加到目标的源……/P>< P>。可以用MaFfile或其他编译工具实现目标:编译一段C++代码,以获得类的大小并将其分配给宏。之后,您可以传递宏来编译真正的代码

以Makefile为例:

CODE_TO_GET_SIZE := "\#include \"class_from_cxx.h\"\n\#include <iostream>\nint main() {std::cout << sizeof(ClassFromCXX);}"

CLASSFROMCXX_SIZE := $(shell printf $(CODE_TO_GET_SIZE) | g++ -x c++ - && ./a.out)

code\u-TO\u-GET\u-SIZE:=“\\\包含\”class\u from\u cxx.h\”\n\\包含\nint main(){std::cout是您的最终目标,您可以执行类似于
unsigned char buf[CLASSFROMCXX\u-SIZE]
在那里初始化一个对象之后?@AshleyWilkes,这在C中也不能很好地工作。您需要解决的实际问题和根本问题是什么?为什么需要类的大小?为什么需要它作为编译时常量?请编辑您的问题以添加更多细节,如果可能的话,询问您的实际问题。您可以可以编写一个C++程序,生成一个C标题文件,其中一个适当的<代码>定义> <代码>,并将它作为构建过程的一部分。如果你想在C中封装一个C++库,那么我建议你编写另一个C++库,它导出一个C API,并使用它来传递<代码>空洞> /COD>指向对象的指针。可以在C++中编写一个包装类,用于C++中的管理和构造的对象,并且可以有一些方法来处理这个问题。@ N314159谢谢你指出。我在这个句子中加了一个句子给我的答案。是的,这似乎是个好主意。我希望将来能实现这样的事情:<代码>定义类FROMMC。XX_从_CPP_常量中提取的大小(sizeof(ClassFromCXX))
然后收集FROM_CPP_常量的所有匹配项,编译它们的参数并打印,用打印值替换它们的匹配项。添加一个方法来获取正在编译和链接的实际C++代码的大小,然后从要使用的.o文件中调用函数,不是更好吗?因为@MichaelKenzel指出但是,内存布局可能取决于编译器的具体使用情况,因此理论上,您在那里进行的调用可能会产生与最终链接的对象不同的大小。是的,我必须传递完全相同的标志并使用相同的编译器,但我不需要使用相同的。o因为如果类的大小因某种原因发生变化,那么ABI就会被破坏。