digitalmars.D - passing char[] as char* should produce a warning
- James Dunne (8/8) Mar 08 2005 As long as a warning system is being worked on, it'd be nice if the comp...
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (5/8) Mar 08 2005 Unless it's a string literal, right ? Since those are 0-terminated in D,
- Charles (8/16) Mar 09 2005 char [] used to be automatically converted to char* when passing them to
- Unknown W. Brackets (10/14) Mar 10 2005 The idea is, if you have a function:
- =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= (21/31) Mar 10 2005 The usual example here being the venerable printf,
-
Stewart Gordon
(18/20)
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 thecompiler letme 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 strangebug, andI 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 ?<snip> 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