From: Jan Svitok Date: 2006-11-20T23:49:57+09:00 Subject: Re: [ ruby-Bugs-6788 ] In a c++ program, when I call "fclose()", or "ofstream::close()" in a file that includes ruby.h, the program crashes On 11/20/06, noreply@rubyforge.org wrote: > Bugs item #6788, was opened at 2006-11-20 16:35 > You can respond by visiting: > http://rubyforge.org/tracker/?func=detail&atid=1698&aid=6788&group_id=426 > > Category: Core > Group: 1.8.2 > Status: Open > Resolution: None > Priority: 3 > Submitted By: ozi alt (ozizus) > Assigned to: Nobody (None) > Summary: In a c++ program, when I call "fclose()", or "ofstream::close()" in a file that includes ruby.h, the program crashes > > Initial Comment: > I am embedding ruby strings to my c++ application and calling them with rb_eval_string, and I love it. > > But I noticed this problem: > > When I call the C call "fclose()", or "ofstream::close()" in a file that includes ruby.h: > > First the Compiler gives a varning: > > Warning 4003: not enough actual parameters for macro 'close' > > But compilation finishes fine. Then on runtime, debugger catches an unhandled exception in the fstream file on this code: > ... > if (fclose(_Myfile) != 0) > _Ans = 0; > } > ... > > If I put the ruby.h inclusion and fclose() call in different files, the system still gives the warnings, but the program works fine. > > I cannot seem to reproduce now, but when I was trying to find the problem I saw some warnings about "rb_w32_fclose" of ruby API. > > No, There is no problem with my code, as the problem reoccurs even with this simple program that I copy/pasted from web: remove the '#include "ruby.h"' and the program works. Else, it crashes. > > > /* fopen example */ > #include > > #include "ruby.h" > > int main () > { > FILE * pFile; > pFile = fopen ("myfile.txt","wt"); > if (pFile!=NULL) > { > fputs ("fopen example",pFile); > fclose (pFile); > } > return 0; > } > > > My system: > > IDE: MSVS2005 on WinXPPro > RUBY: ruby 1.8.2 (2004-12-25) [i386-mswin32] > > Good Luck I've had a similar problem recently, when compiling a C++ extension with vs2005 and 1.8.5 libs, this time I had a Warning 4003: not enough actual parameters for macro 'write' and Warning 4003: not enough actual parameters for macro 'read' in ostream and istream respectively ('write' is an argument to some STL method) I got around this with #undef write and #undef read just before #Include or whatever the main included file was. I don't call 'write' and 'read' in my code anyway, and none of the header mentions them either. So far it seems to work, although I don't feel really safe ;-) My problem didn't happen in 1.8.4 as those macros were enclosed within #ifdef __BORLANDC__ (although this is not the case with close and fclose).