gpt4 book ai didi

C++ 将对象创建为静态 - 需要关于良好实践的建议

转载 作者:行者123 更新时间:2023-12-02 10:35:22 24 4
gpt4 key购买 nike

我主要是 C 程序员,在 Raspberry Pi 上构建原型(prototype)。我广泛使用了一些开源 C 代码,但也使用了带有 C++ 驱动程序的 Raspberry Pi 硬件插件。所以我需要他们一起工作。我做了一些研究,并通过编写带有 extern "C"声明的 C++ 函数,将其编译为共享库并将其与我的 C 程序链接,让它们一起工作。

我需要 C++ 函数在第一次调用它时实例化一个对象,然后能够在后续调用该函数时与该对象进行交互。我对如何直接在 C 中创建和访问 C++ 对象的说明感到有些不知所措,因此我尝试在创建对象之前简单地添加“静态” - 并通过 C 包装器的中介与对象交互。这似乎工作得很好,但我有点担心这不是通常作为“在 C 中使用 C++ 对象”的答案,所以我想知道我是否会遇到无法预料的问题?在这个阶段我不需要我的代码是高质量的,但我不想以段错误结束,因为我做了一些愚蠢的事情。任何建议将不胜感激。

这是一个精简版来展示我在做什么。在此示例中,我创建了一个简单的 c++ 函数,该函数从调用 C 程序中获取一个 int 参数。如果参数为 0,它会创建对象并将数组中的所有 LED 设置为 0。如果我第二次使用参数 = 1 调用它,它会指示同一个对象点亮所有红色 LED。此代码有效。

#include <string.h>
#include <matrix_hal/everloop.h>
#include <matrix_hal/everloop_image.h>
#include <matrix_hal/matrixio_bus.h>

extern "C" int led_change(int input_from_c)
{
namespace hal = matrix_hal;

static hal::MatrixIOBus bus;
static hal::EverloopImage image1d(18);
static hal::Everloop everloop;

if (input_from_c == 0)
{
if (!bus.Init()) return false;
// this line just resizes the EverloopImage object to the number of LEDs on the board
everloop.Setup(&bus);
// switch off the leds
for (int i=0;i<18;i++)
{
image1d.leds[i].red = 0;
image1d.leds[i].green = 0;
image1d.leds[i].blue= 0;
image1d.leds[i].white = 0;
}
everloop.Write(&image1d);
}
else if (input_from_c == 1)
{
for (int i=0;i<18;i++)
{
image1d.leds[i].red = 100;
image1d.leds[i].green = 0;
image1d.leds[i].blue= 0;
image1d.leds[i].white = 0;
}
everloop.Write(&image1d);
}
return 1;
}

C中的调用代码只是
#include  <unistd.h>
#include <stdio.h>

int led_change (int);
int i;

void main () {
i = led_change(0);
printf("returned %d\n",i);
sleep(1);
i = led_change(1);
printf("returned second time %d\n",i);
}

希望这清楚。谢谢你的帮助。

最佳答案

您需要将所有 C 代码编译并链接为 C++ 模块。反过来不行。 C 不知道要为您的 static 调用的构造函数。 c++ 模块中的对象...因此链接器必须了解 c++ 调用序列。 C++ 语言的设计考虑了旧 C 代码的兼容性。但是 C 在设计时并没有考虑到这种说法。

尽管如此,C++ 编译器通常也可以编译纯 C 代码(在 C 语言模式下),因此这些编译器之一将是有效的。它将生成可以在同一个程序中毫无问题地存在的代码。

你可以有一个C代码main() c++ 程序中的函数,但始终使用 c++ 链接器将该代码链接到程序中。

关于C++ 将对象创建为静态 - 需要关于良好实践的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60587302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com