如何将从 Ruby 数组中取出的字符串转换为 C/C++ 字符串
How to convert a string taken out from a Ruby array into a C/C++ String
我正在为 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;
相关文章:
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 如何将这个std::字符串转换为std::基本字符串
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在C++中将十六进制字符串转换为文本数据
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何从字符串转换为双精度*
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 如何在C++中将 Python 字符串转换为其转义版本?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何将整数字符串转换为整数的二维向量?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 将文件复制到自定义位置,存在字符串转换问题
- 将ANSI C字符串转换为UNICODE
- 如何将节点 V8 字符串转换为 C++ 字符串
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将字符串转换为无符号字符数组/字节数组