如何将从 Ruby 数组中取出的字符串转换为 C/C++ 字符串

How to convert a string taken out from a Ruby array into a C/C++ String

本文关键字:字符串 转换 C++ Ruby 数组      更新时间:2023-10-16
我正在为 Ruby 编写一个C++

扩展,并尝试从 Ruby 数组对象中提取一个 Ruby 字符串对象,并将其转换为 C/C++ 字符串对象。

我有foo.cpp

#include <iostream>
#include <ruby.h>
VALUE bar_func(VALUE self, VALUE ary){
    std::string s = StringValuePtr(rb_ary_entry(ary, 0));
    ...
    return 0;
}
extern "C" VALUE rb_cFoo;
VALUE rb_cFoo;
extern "C" void Init_foo(){
    rb_cFoo = rb_define_class("Foo", rb_cObject);
    rb_define_singleton_method(rb_cFoo, "bar", RUBY_METHOD_FUNC(bar_func), 1);
}

测试.rb

require "foo"
Foo.bar(["Hello World!"])

当我尝试编译foo.cpp时,编译器返回一个错误,说"单个术语和操作数需要左侧值"(不是确切的消息,从另一个自然语言中给出的错误消息翻译而来)。这是关于我对StringValuePtr的使用.我做错了什么,如何修复?

首先,StringValuePtr 不返回适合赋值运算符的以 null 结尾的 C 字符串。应使用 StringValueCStr 宏,该宏也将VALUE作为参数。

StringValueCStr定义如下:

#define StringValueCStr(v) rb_string_value_cstr(&(v))

rb_string_value_cstr函数签名为:

char * rb_string_value_cstr(volatile VALUE *ptr)

宏扩展后,代码应如下所示:

std::string s = rb_string_value_cstr(&rb_ary_entry(ary, 0));

你的代码对我来说没有错。尝试将每个部分放在单独的行中,看看是否可以缩小错误的来源:

VALUE entry = rb_ary_entry(ary, 0);
char * c_str = StringValueCStr(entry);
std::string str = c_str;