与 stdbool.h 接口 C++

24 浏览
0 Comments

与 stdbool.h 接口 C++

在一个项目中,我正在C++和一个使用stdbool.h定义的C库之间进行接口。一些结构体具有bool成员。所以,如果我在C++函数中定义了这些结构体作为局部变量,并将其传递给一个C函数,那么C++和C之间的大小是不一致的,因为bool在C++中占用一个字节,在C中占用四个字节。

有没有人有什么建议,如何克服这个问题,而不是采取我目前的解决方案,即将bool定义为unsigned char,这违反了C99标准的stdbool.h。

0
0 Comments

问题的出现原因是C和C++之间对于bool类型的定义冲突,无法在彼此之间共享源代码并进行链接。解决方法是通过一个中间的数据结构来实现代码的共享和链接。但是,由于不能修改定义C++程序和C库之间接口的代码,所以需要创建一个shim来连接C++程序和C库。

具体的解决方法如下:

1. 创建一个名为boolean的联合体,其中包含一个bool类型的成员value_cpp和一个int类型的成员value_c。

2. 在C库函数的定义中,将bool类型的参数和返回值替换为boolean类型。

3. 在C++程序中,创建一个名为library_func_1_cpp的函数,参数和返回值与library_func_1相同。

4. 在library_func_1_cpp函数中,调用library_func_1函数,并使用static_cast将bool类型的参数转换为int类型。

5. 将library_func_1_cpp作为替代函数来调用。

通过以上的步骤,就能够解决C和C++之间bool类型定义冲突的问题,并实现源代码的共享和链接。

0
0 Comments

在这段代码中,作者提到了在C++中与stdbool.h接口的问题。原因是在一些编译器中,stdbool.h的实现与C99标准不兼容。为了解决这个问题,作者找到了一个更兼容C99标准的stdbool.h的实现。

为了实现兼容性,代码中使用了条件编译。首先,如果编译器不是C++编译器,那么会进行以下操作。首先,检查编译器是否是GCC编译器,如果不是,则定义一个名为_Bool的类型,并将其定义为int8_t类型。然后,定义一个名为bool的类型,并分别定义truefalse的值。最后,定义一个宏__bool_true_false_are_defined,其值为1。

这样,在C++代码中,就可以通过包含stdbool.h头文件来使用bool类型和true/false常量,而不会出现与C99标准不兼容的问题。

作者还提到,_Bool类型在VS2013中已经定义,所以还需要检查编译器版本是否小于1800,以便进行适当的处理。

总结起来,这段代码解决了在C++中与stdbool.h接口的兼容性问题,通过条件编译来定义兼容C99标准的bool类型和true/false常量。

0
0 Comments

在C++中,与stdbool.h接口的问题出现的原因是C和C++对于布尔类型的定义不同。在C++中,bool是一个关键字,C++保证bool类型只能存储1或0的值,不能存储其他任何值。而C语言没有这样的保证。

如果在C和C++之间的互操作性很重要,可以通过定义一个与C的自定义布尔类型相同的类型来模拟C的布尔类型,并在C++中使用该类型而不是内置的bool类型。这样做的结果是在C和C++之间存在一个具有相同行为的布尔类型,但可能会导致布尔类型的一些错误。解决方法是定义一个自定义的布尔类型,并在C++中使用该类型。

下面是一种可能的解决方法示例:

// 定义一个与C的布尔类型相同的自定义布尔类型
typedef int CBool;
// 在C++中使用自定义布尔类型
void myFunction(CBool flag) {
  if (flag) {
    // ...
  } else {
    // ...
  }
}
int main() {
  // 使用自定义布尔类型
  CBool myFlag = 1;
  myFunction(myFlag);
  return 0;
}

通过定义一个与C的自定义布尔类型相同的类型,可以确保在C++中与C进行互操作时具有相同的布尔类型行为。这样可以解决C++中与stdbool.h接口的问题,并保持C和C++之间的一致性。

0