Ruby extension and static function in C++

Y

yue_nicholas

HI,

I am writing an extension for Ruby in C++ and as I have more and more
functions, I need to separate them into individual C++ source for
easier maintenance in the long run.

From Programming Ruby, the section on Extending Ruby defines function
as static, if I continue to use the static keyword and the functions
are implemented in separate C++ source file, it would not be visible in
the main ruby method registration file.

How significant is the static keyword when defining functions for use
as Ruby extension?

I had a quick browse of the ruby-netcdf package and noticed that they
do not prefix their function with the static keyword.

Anyone has advice?

Cheers
 
F

Francis Cianfrocca

HI,

I am writing an extension for Ruby in C++ and as I have more and more
functions, I need to separate them into individual C++ source for
easier maintenance in the long run.

From Programming Ruby, the section on Extending Ruby defines function
as static, if I continue to use the static keyword and the functions
are implemented in separate C++ source file, it would not be visible in
the main ruby method registration file.

How significant is the static keyword when defining functions for use
as Ruby extension?

I had a quick browse of the ruby-netcdf package and noticed that they
do not prefix their function with the static keyword.

Anyone has advice?

Cheers

As a general rule, I dislike exposing C++ as a library interface. I
prefer to write a light wrapper in C on top of the C++ functionality-
much easier to link with other code that way because you have much
more control over the names that the linker sees. Then, put the Ruby
wrapper on top of the C wrapper, and all of the Ruby extension
functions can be static, and it will all fit reasonably into one
source file (because the extension functions are only making calls to
another interface).

For an example, look at the extension code in EventMachine (under
branch version_0). The Ruby wrapper is in rubymain.cpp. The C wrapper
is in cmain.cpp. Everything else is C++.
 
Y

yue_nicholas

Francis said:
For an example, look at the extension code in EventMachine (under
branch version_0). The Ruby wrapper is in rubymain.cpp. The C wrapper
is in cmain.cpp. Everything else is C++.

Thanks.

Looking at the code

static VALUE t_add_oneshot_timer (VALUE self, VALUE interval)
{
const char *f = evma_install_oneshot_timer (FIX2INT (interval));
if (!f || !*f)
rb_raise (rb_eRuntimeError, "no timer");
return rb_str_new2 (f);
}

I have a further question, the parameter I get in my call is an array
e.g.

["pos",[ 0, 0, 0],"dir",[1, 0, 1],"custom",[ 0, 1, 1, 2, 2, 2,
3, 1, 1]]

they are token-value pair

Should I process the array in cmain.cpp or rubymain.cpp

If in cmain.cpp I would need to include "ruby.h" for the definition of
"VALUE" right?

Cheers
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top