Tuesday, March 1, 2011

String literals C++?

I need to do the following C# code in C++ (if possible). I have to const a long string with lots of freaking quotes and other stuff in it.

const String _literal = @"I can use "quotes" inside here";
From stackoverflow
  • There is no raw string literals in C++. You'll need to escape your string literals.

    std::string str = "I can use \"quotes\" inside here";
    

    C++0x offers a raw string literal when it's available:

    R"C:\mypath"
    

    By the way you should not name anything with a leading underscore as such identifiers are reserved in C++.

    Dennis Zickefoose : Names beginning with an underscore and then followed by a capital letter are reserved for the implementation for any use, so you can't use them at all. Names beginning with an underscore in general are only reserved as names in the global namespace.
    R Samuel Klatchko : @Brian - raw strings use parentheses `R"(C:\mypath)"`
  • There is no such mechanism in C++. You'll have to do it the old fashioned way, by using escapes.

    You might be able to use a scripting language to make the escaping part a little easier, though. For instance, the %Q operator in Ruby will return a properly escaped double-quoted string when used in irb:

    irb(main):003:0> %Q{hello "world" and stuff     with    tabs}
    => "hello \"world\" and stuff\twith\ttabs"
    
    jalf : are you seriously suggesting embedding a Ruby interpreter in your C++ program just to escape a string?
    Mark Rushakoff : @jalf: Absolutely not! I was suggesting to paste the string into Ruby once, then paste that result back into his source file. I can see where my answer could be interpreted in that ridiculous manner, though.
  • There is no equivalent of C#'s "@" in C++. The only way to achieve it is to escape the string properly:

    const char *_literal = "I can use \"quotes\" inside here";
    
  • That is not available in C++03 (the current standard).

    That is part of the C++0x draft standard but that's not readily available just yet.

    For now, you just have to quote it explicitly:

    const std::string _literal = "I have to escape my quotes in \"C++03\"";
    

    Once C++0x becomes reality, you'll be able to write:

    const std::string _literal = R"(but "C++0x" has raw string literals)";
    

    and when you need )" in your literal:

    const std::string _literal = R"DELIM(more "(raw string)" fun)DELIM";
    
    paxdiablo : +1 for educating me.
    R Samuel Klatchko : @paxdiablo - you're welcome. On a side note, my earlier example was incorrect. Raw strings use parentheses, not square bracket as delimiters. Also raw strings have more flexibility then my example shows (you can add a delimiter so that you can put `)"` in the actual string.

0 comments:

Post a Comment