digitalmars.D - passing char[] as char* should produce a warning
- James Dunne <jdunne4 bradley.edu> Mar 08 2005
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se> Mar 08 2005
- "Charles" <cee-lo green.com> Mar 09 2005
- "Unknown W. Brackets" <unknown simplemachines.org> Mar 10 2005
- Stewart Gordon <smjg_1998 yahoo.com> Mar 10 2005
As long as a warning system is being worked on, it'd be nice if the compiler let me know if I was passing in a char[] for a char* argument to an extern (C) function. I just ran into this doing some DerelictSDL programming. Very strange bug, and I didn't notice it since I was so convinced I was writing "Super C" code. :-) Forgot about toStringz(). Regards, James Dunne
Mar 08 2005
James Dunne wrote:As long as a warning system is being worked on, it'd be nice if the compiler let me know if I was passing in a char[] for a char* argument to an extern (C) function.
Unless it's a string literal, right ? Since those are 0-terminated in D, and since you would get a ton* of warnings when using C stuff otherwise. --anders * well, mostly from printf probably, but as long as that is in object...
Mar 08 2005
char [] used to be automatically converted to char* when passing them to functions which expect char *. I think still ? Charlie "James Dunne" <jdunne4 bradley.edu> wrote in message news:d0m54o$1do0$1 digitaldaemon.com...As long as a warning system is being worked on, it'd be nice if the
me know if I was passing in a char[] for a char* argument to an extern (C) function. I just ran into this doing some DerelictSDL programming. Very strange
I didn't notice it since I was so convinced I was writing "Super C" code.
Forgot about toStringz(). Regards, James Dunne
Mar 09 2005
The idea is, if you have a function: extern (C) void f(char* text); And you pass it a string, like so: f(char_array); You may be doing this in error; it may be that you wanted to use: f(toStringz(char_array)); Or similar. Personally, I think this is unnecessary. If I was really worried, I'd write a wrapper (which better be inlined!!) to toStringz() it and take a char[] array anyway, but only if I were so worried. -[Unknown]char [] used to be automatically converted to char* when passing them to functions which expect char *. I think still ? Charlie
Mar 10 2005
Unknown W. Brackets wrote:char [] used to be automatically converted to char* when passing them to functions which expect char *. I think still ?
The idea is, if you have a function: extern (C) void f(char* text);
The usual example here being the venerable printf, which gets passed D string literals (that are char[]) which Walter likes so much that it goes in object.d, and other such C functions from the C standard library And to make these easier to use, char[] can be converted automatically to char* and they are declared as "char*" instead of as ubyte* or byte* which would be the *proper* declaration unless they really accept UTF-8 code units... Otherwise, calling C functions would be quite a hassle ? (which could arguably be a good thing, promoting writef)And you pass it a string, like so: f(char_array);
If you really *want* to do this, you should probably use char_array.ptr which is a neat way to access it ? Makes it clear that you want to get at the raw data, and will worry about any zero-termination yourself. > You may be doing this in error; it may be that you wanted to use:f(toStringz(char_array));
Which would probably be the most safe approach, too... (explicitly doing a ~ "\0", like that std routine does) Or you could use char_array.length and char_array.ptr, like the "%.*s" approach to printf does (implicitly) ? --anders
Mar 10 2005
Charles wrote:char [] used to be automatically converted to char* when passing them to functions which expect char *. I think still ?
Therein lies the problem. It's too easy to pass a non-null-terminated string to a C function. I've just been reminded of this.... ---------- These two strings walk into a bar and sit down. The bartender says, "So what'll it be?" The first string says, "I think I'll have a beer quag fulk boorg jdk^CjfdLk jk3s d#f67howe%^U r89nvy~~owmc63^Dz x.xvcu" "Please excuse my friend," the second string says, "He isn't null-terminated." ---------- But it predates D by about nine years :-( Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on the 'group where everyone may benefit.
Mar 10 2005









=?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se> 