代码之家  ›  专栏  ›  技术社区  ›  AntonioCS

长弦

  •  5
  • AntonioCS  · 技术社区  · 16 年前

    嘿!我见过C代码,它使用@告诉编译器字符串中有新行,并且应该都在一行中。 C/C++有什么类似的东西吗?

    比如,如果我想放像:

    73167176531330624919225119674265742355349194934 9698352031277450632623957831801698401869478851843 8586156078912949495459501737958331952853208805511 1254069847158523863050715693290963295227443043557 6689664895045244523161731856403098711121722383113 6222989343380308135336276614282806444486645238749 303589072962904915604407723907138105158593079960866 70172427121883998797908792274921901699720888093776 6572733301053367881220235421809751254540594752243 52584907711670556013604839586446706324415722155397 53697817977846174064955149290862569321978468622482 8397224137565705607490261407972968652414535100474 8216637048440319989000889524345658541227588666881 16427171479924442928230863465674813919123162824586 17866458359124566529476545682848912883142607690042 2421902267105562632111109370544217506941658960408 071984038509624544362981230987879927244284909188 845801561660979191338754999200524063689912560717606 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450

    在一个字符串中,我不想把它全部放在一行中,而是像这样放,让编译器知道这只是一行。

    5 回复  |  直到 10 年前
        1
  •  6
  •   unwind    16 年前

    C和C++具有相邻引用字符串的自动连接。这意味着

    const char *a = "a" "b";
    

    const char *b = "ab";
    

    将使 a b 指向相同的数据。当然,您可以扩展它,但是当字符串包含引号时,它会变得很麻烦。您的示例似乎不适用,因此它可能是实用的。

        2
  •  15
  •   Jon Skeet    10 年前

    在第一次写入时,C和C++没有任何类似于C字形字符串的文字。你能做的最接近的是:

    "73167176531330624919225119674426574742355349194934"
    "96983520312774506326239578318016984801869478851843" 
    "85861560789112949495459501737958331952853208805511"  
    "12540698747158523863050715693290963295227443043557" 
    "66896648950445244523161731856403098711121722383113" 
    "62229893423380308135336276614282806444486645238749" 
    "30358907296290491560440772390713810515859307960866" 
    "70172427121883998797908792274921901699720888093776" 
    "65727333001053367881220235421809751254540594752243"  
    "52584907711670556013604839586446706324415722155397" 
    "53697817977846174064955149290862569321978468622482" 
    "83972241375657056057490261407972968652414535100474" 
    "82166370484403199890008895243450658541227588666881" 
    "16427171479924442928230863465674813919123162824586"  
    "17866458359124566529476545682848912883142607690042"
    "24219022671055626321111109370544217506941658960408" 
    "07198403850962455444362981230987879927244284909188" 
    "84580156166097919133875499200524063689912560717606" 
    "05886116467109405077541002256983155200055935729725"     
    "71636269561882670428252483600823257530420752963450"
    

    然而,请注意,即使在C中,它也不会像您希望的那样工作。如果你有:

    string foo = @"x
    y";
    

    在C中,字符串实际上包含一个换行符。

    在C++ 11中,根据注释, R 前缀表示 原始字符串文本 ,例如

    string x = R"(First line
    second line)";
    
        3
  •  7
  •   ChrisN    16 年前

    在C和C++中你可以做到这一点:

    const char* str = "73167176531330624919225119674426574742355349194934"
                      "96983520312774506326239578318016984801869478851843";
    

    编译器会自动将它们连接成一个字符串。

        4
  •  5
  •   aib    16 年前

    另一种选择是在看到预处理器将删除以下新行后,用\结束一行:

    const char *str = "Hello,\
     World!";
    

    它不像上面所说的那样依赖于相邻字符串文本的自动连接;但无论如何都应该提到。

        5
  •  4
  •   paxdiablo    16 年前

    当然,你可以这样做:

    char *x = "73167176531330624919225119674426574742355349194934\n"
              "96983520312774506326239578318016984801869478851843\n"
                         <lines removed for brevity>
              "71636269561882670428252483600823257530420752963450";
    

    这将完全模拟@“”行为(包括换行符)。

    如果你真的想让它成为一行,没有换行符,不要把\n“换行符放进去,但是这和@“东西在C中的工作方式略有不同。