포스트

C++ 컴파일 시 표준(extension) 관련 에러

auto, ranged-for 등 표준 기능이 "extension"으로 경고/에러 나면 -std= 옵션으로 명시

C++ 컴파일 시 표준(extension) 관련 에러

증상

1
2
warning: 'auto' type specifier is a C++11 extension
'auto' return without trailing return type; deduced return types are a C++14 extension

컴파일러가 기본 모드(-std=gnu++98 같은 옛 표준)로 동작 중이라, 새 표준 기능을 “extension”이라며 경고한다.

어떤 표준에서 뭐가 들어왔나

기능표준
auto 변수 타입C++11
auto 반환 추론 (auto f() { ... })C++14
ranged-for (for (auto& x : v))C++11
constexprC++11, 확장 C++14/17/20
구조적 바인딩 (auto [a, b] = ...)C++17
ConceptsC++20
ModulesC++20

쓰는 기능이 어느 표준에 속하는지 보고 그에 맞춰 옵션을 준다.

명령줄로 표준 지정

1
2
g++ -std=c++17 main.cpp -o main
clang++ -std=c++20 main.cpp -o main

-std=gnu++17은 표준 + GNU 확장. 더 관대하지만 다른 컴파일러에서 안 될 수 있으니 보통 c++17이 안전하다.

Makefile

1
CXXFLAGS = -std=c++17 -Wall -Wextra

CMake

1
2
3
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)       # gnu++17이 아니라 c++17

CMAKE_CXX_STANDARD_REQUIRED ON은 컴파일러가 그 표준을 지원하지 않으면 fallback 없이 에러로 실패하게 한다.

VS Code (clangd / IntelliSense)

.vscode/c_cpp_properties.json:

1
2
3
4
5
6
7
8
9
{
  "configurations": [
    {
      "name": "Mac",
      "cppStandard": "c++17",
      "intelliSenseMode": "macos-clang-arm64"
    }
  ]
}

clangd를 쓰면 compile_commands.json(CMake가 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON으로 생성) 정보를 보고 자동으로 표준을 맞춘다 — 별도 설정 불필요.

일회용 alias

매번 옵션 주기 귀찮으면:

1
2
echo 'alias g++="g++ -std=c++17"' >> ~/.bashrc
source ~/.bashrc

다만 빌드 시스템(make/cmake)에 명시하는 게 협업에는 더 안전하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.