C/C++メモ

すぐに忘れるため、いろいろメモする。これは最適解ではない。

開発環境

エディタはVSCodeでもNeovimでもCLionでもいい。

LSPにはclangdを使う。VSCodeの場合はMicrosoftのC/C++拡張を早急に消し飛ばしてclangdを入れる。

コンパイラの優先度はclang >= gcc >>MSVC。

CMake

compile_commands.json

clangdがプロジェクトの構成(インクルードするディレクトリとか)を把握するためにはcompile_commands.jsonが必要。これは設定すればCMakeが出力してくれる。

CMakeLists.txtに下記のを追記しておくことで、常にcompile_commands.jsonを生成してくれるようになる。お行儀がいいかは知らない。

CMakeLists.txt
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
if(CMAKE_EXPORT_COMPILE_COMMANDS)
  set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES 
      ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
endif()

それとWindows環境のデフォルトではcompile_commands.jsonが生成されないので注意。Ninjaを入れてジェネレータにNinjaを指定することで生成される。

警告を出す

コンパイラごとにオプションが違うため、分岐させる。特にClangは私が気に入らない警告は除外している。
file name
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(stock_emu_lib PRIVATE
    -Wall -Weverything
    -Wno-c++98-compat -Wno-padded -Wno-exit-time-destructors -Wno-global-constructors
)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
target_compile_options(stock_emu_lib PRIVATE
    -Wall
)
elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
target_compile_options(stock_emu_lib PRIVATE
    /Wall
)