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 )