Closed Bug 57087 Opened 24 years ago Closed 24 years ago

NS_LITERAL_STRING doesn't allow literal concats inside the operation on Windows

Categories

(Core :: XPCOM, defect, P3)

defect

Tracking

()

RESOLVED FIXED
mozilla0.8

People

(Reporter: dmosedale, Assigned: scc)

Details

Attachments

(1 file)

I often use NS_LITERAL_STRING on long strings that need to be broken across
multiple lines.  So I tend to use constructs that split literal strings across
lines, like so:

		NS_LITERAL_STRING("the quick brown fox jumped over the "
                                  "lazy goat")

This currently causes the windows compiler to barf.

In nsAReadableString.h, around line 1534, we see:

#ifdef HAVE_CPP_2BYTE_WCHAR_T
  #define NS_LITERAL_STRING(s)          nsLiteralString(L##s,
(sizeof(L##s)/sizeof(wchar_t))-1)
  #define NS_NAMED_LITERAL_STRING(n,s)  nsLiteralString n(L##s,
(sizeof(L##s)/sizeof(wchar_t))-1)
#else

My suspicion is that replacing the 4 instances of |s| with |(s)| would fix this
problem.
The main problem I have with this is that in practice

  L"hello"

defines a wide string, but

  L("hello")

turns out to be a function call to an undefined function.  Checking the
standard, I find (my normal quotes added to show what parts they labeled as
literals)

  2.13.4 String literals [lex.string]

  string literal:
    |"| s-char-sequence[opt] |"|
    |L"| s-char-sequence[opt] |"|

This language will definitely be interpreted by a compiler writer as implying
that |L"| is a single token which cannot be interrupted by whitespace or parens.
 It is this that makes me have to say |L##s| in the macro, which leads not only
to this problem, but to the bad interaction with other macros, e.g.,

  #define MY_STRING "hello"

  // ...
   ... NS_LITERAL_STRING(MY_STRING) ...

At least that problem can be solved (thanks timeless for the first use of this) with

  #define MY_STRING NS_LITERAL_STRING("hello")

Now maybe, if you were willing to double wrap your string parts, we could come
up with something.  Since

  L"xxx" L"yyy"

must be equivalent to

  L"xxxyyy"

maybe we can make a pair of macros that work together ... one to conditionally
provide the |L|, the other to make the object declaration and size calculation.
 This would make you put something like this in your code

NS_MULTILINE_LITERAL_STRING( NS_L("the first ...")
                             NS_L("...")
                             NS_L("...") )

Does that work for you?  What do you think would be appropriate names? for this
new family of macros?

  
Status: NEW → ASSIGNED
Sure, that seems reasonable.  And the names you suggest seem as good as any.
Component: XPCOM → String
Target Milestone: --- → mozilla0.8
Keywords: approval, patch, review
OS: Windows NT → All
Hardware: PC → All
Looks okay to me. [r|sr]=waterson, pick one.
patch checked in
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Keywords: approval, patch, review
Resolution: --- → FIXED
Component: String → XPCOM
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: