最終更新日時(UTC):
が更新

履歴 編集

行末スペースを無視するよう規定(C++23)

概要

\ (バックスラッシュ) 後の行末スペースを無視するよう規定する。

これにより、バックスラッシュ後の行末スペースの有無でコンパイラによって動作が異なることがなくなる。

この機能が必要になった背景・経緯

バックスラッシュから行末までの間のスペースをどう扱うかが、実装 (コンパイラ) によって違いがあった。

#include <iostream>

int f() {
  int i = 1
  // \ 
  + 42
  ;
  return i;
}

int main() {
  std::cout << f() << std::endl;
}

このコードにおいて「// \」のあとにはスペースがあり、EDG (ICCのフロントエンド)、GCC、Clangは行末スペースをトリミング (削除) して関数f()43を返すが、MSVCはトリミングせず1を返していた。プラットフォーム間の動作差異をなくすために、実装は行末スペースをトリミングしなければならないよう提案することとした。

例として、IDEやツール (コードフォーマッタ) はそのような行末スペースを削除する可能性があり、Googleのコーディングスタイルでは行末スペースを禁止している。

ただしこの規定が入ることによって、行末スペースに依存したMSVCの既存のコードが互換性をなくす可能性はある (有用性は低いので問題になる可能性は低い)。GCC、Clang、ICCはデフォルトで行末スペースに対して有用な警告を出力していた。

行末バックスラッシュを使用した例を紹介する。アスキーアートやダイアグラムをコメントで表現する人々がいる。

#include <iostream>

int f() {
  int hax = 0;
  // _ _
  // | | | |
  // | |__| | __ ___ __
  // | __ |/ _` \ \/ /
  // | | | | (_| |> <
  // |_| |_|\__,_/_/\_\ 
  hax = 1337;
  return hax;
}

int main() {
  // 0が出力される。
  // 行末スペースが無視されなければ1337が出力される
  std::cout << f() << std::endl;
}

参照