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 |
constexpr | C++11, 확장 C++14/17/20 |
구조적 바인딩 (auto [a, b] = ...) | C++17 |
| Concepts | C++20 |
| Modules | C++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 라이센스를 따릅니다.