What exactly are the String literrals in D and how they work?

Mike Parker aldacron at gmail.com
Sun Aug 15 09:06:14 UTC 2021


On Sunday, 15 August 2021 at 08:11:39 UTC, rempas wrote:

>
> I mean that in C, we can assign a string literal into a `char*` 
> and also a `const char*` type without getting a compilation 
> error while in D, we can only assign it to a `const char*` 
> type. I suppose that's because of C doing explicit conversion. 
> I didn't talked about mutating a string literal

The D `string` is an alias for `immutable(char)[]`, immutable 
contents of a mutable array reference (`immutable(char[])` would 
mean the array reference is also immutable). You don't want to 
assign that to a `char*`, because then you'd be able to mutate 
the contents of the string, thereby violating the contract of 
immutable. (`immutable` means the data to which it's applied, in 
this case the contents of an array, will not be mutated through 
any reference anywhere in the program.)

Assigning it to `const(char)*` is fine, because `const` means the 
data can't be mutated through that particular reference (pointer 
in this case). And because strings in C are quite frequently 
represented as `const(char)*`, especially in function parameter 
lists, D string literals are explicitly convertible to 
`const(char)*` and also NUL-terminated. So you can do something 
like `puts("Something")` without worry.

This blog post may be helpful:

https://dlang.org/blog/2021/05/24/interfacing-d-with-c-strings-part-one/



More information about the Digitalmars-d-learn mailing list