Skip to content

Instantly share code, notes, and snippets.

@lopesivan
Created October 5, 2025 05:22
Show Gist options
  • Save lopesivan/580471e04557d8b50da0858f9b0db41d to your computer and use it in GitHub Desktop.
Save lopesivan/580471e04557d8b50da0858f9b0db41d to your computer and use it in GitHub Desktop.
Criei um guia completo sobre como selecionar a versão do C++ no GCC! 🎯

Aqui estΓ£o as formas de selecionar a versΓ£o do C++ no GCC:

πŸ”₯ Resposta RΓ‘pida:

# C++11
g++ -std=c++11 main.cpp -o programa

# C++14
g++ -std=c++14 main.cpp -o programa

# C++17 (recomendado)
g++ -std=c++17 main.cpp -o programa

# C++20 (moderno)
g++ -std=c++20 main.cpp -o programa

# C++23 (mais recente)
g++ -std=c++23 main.cpp -o programa

πŸ“‹ VersΓ΅es DisponΓ­veis:

PadrΓ£o Flag GCC MΓ­nimo
C++98 -std=c++98 GCC 3.4+
C++11 -std=c++11 GCC 4.8+
C++14 -std=c++14 GCC 5.0+
C++17 -std=c++17 GCC 7.0+ ⭐
C++20 -std=c++20 GCC 10.0+
C++23 -std=c++23 GCC 11.0+

πŸ’‘ Exemplo Completo:

# Com warnings e otimizaΓ§Γ£o
g++ -std=c++17 -Wall -Wextra -O2 main.cpp -o programa

πŸ› οΈ No Makefile:

CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -O2

πŸ“¦ No CMake:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

Recomendo C++17 para a maioria dos projetos modernos - tem excelente suporte e Γ³timas features! πŸš€

#!/usr/bin/env bash
# Guia completo sobre seleΓ§Γ£o de versΓ£o C++ no GCC/G++
# Mostra todas as formas e versΓ΅es disponΓ­veis
echo "╔════════════════════════════════════════════════════════════╗"
echo "β•‘ Selecionando VersΓ£o do C++ no GCC/G++ β•‘"
echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
echo
# =============================================================================
# MÉTODO 1: Flag -std
# =============================================================================
echo "═══ MΓ‰TODO PRINCIPAL: Flag -std ═══"
echo
echo "Sintaxe bΓ‘sica:"
echo " g++ -std=c++XX arquivo.cpp -o programa"
echo " gcc -std=c++XX arquivo.cpp -o programa -lstdc++"
echo
# =============================================================================
# VERSΓ•ES DISPONÍVEIS
# =============================================================================
echo "═══ VERSΓ•ES DO C++ DISPONÍVEIS ═══"
echo
echo "β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”"
echo "β”‚ PadrΓ£o β”‚ Flag β”‚ GCC MΓ­nimo β”‚"
echo "β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€"
echo "β”‚ C++98 β”‚ -std=c++98 β”‚ GCC 3.4+ β”‚"
echo "β”‚ C++03 β”‚ -std=c++03 β”‚ GCC 3.4+ β”‚"
echo "β”‚ C++11 β”‚ -std=c++11 β”‚ GCC 4.8+ β”‚"
echo "β”‚ C++14 β”‚ -std=c++14 β”‚ GCC 5.0+ β”‚"
echo "β”‚ C++17 β”‚ -std=c++17 β”‚ GCC 7.0+ β”‚"
echo "β”‚ C++20 β”‚ -std=c++20 β”‚ GCC 10.0+ β”‚"
echo "β”‚ C++23 β”‚ -std=c++23 β”‚ GCC 11.0+ β”‚"
echo "β”‚ C++26 β”‚ -std=c++26 β”‚ GCC 14.0+ (experim.) β”‚"
echo "β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜"
echo
echo "πŸ”Ή Variantes GNU (com extensΓ΅es GNU):"
echo " -std=gnu++98, -std=gnu++11, -std=gnu++14, -std=gnu++17, etc."
echo " (Adiciona extensΓ΅es especΓ­ficas do GCC)"
echo
# =============================================================================
# EXEMPLOS PRÁTICOS
# =============================================================================
echo "═══ EXEMPLOS PRÁTICOS ═══"
echo
echo "1️⃣ C++11 (auto, lambda, nullptr):"
echo " g++ -std=c++11 main.cpp -o programa"
echo
echo "2️⃣ C++14 (binary literals, generic lambdas):"
echo " g++ -std=c++14 main.cpp -o programa"
echo
echo "3️⃣ C++17 (filesystem, structured bindings, if constexpr):"
echo " g++ -std=c++17 main.cpp -o programa"
echo
echo "4️⃣ C++20 (concepts, ranges, coroutines, modules):"
echo " g++ -std=c++20 main.cpp -o programa"
echo
echo "5️⃣ C++23 (std::print, if consteval, multidimensional subscript):"
echo " g++ -std=c++23 main.cpp -o programa"
echo
echo "6️⃣ MΓΊltiplos arquivos:"
echo " g++ -std=c++17 main.cpp utils.cpp -o programa"
echo
echo "7️⃣ Com otimizaΓ§Γ£o:"
echo " g++ -std=c++20 -O3 main.cpp -o programa"
echo
echo "8️⃣ Com warnings e debug:"
echo " g++ -std=c++17 -Wall -Wextra -g main.cpp -o programa"
echo
# =============================================================================
# VERIFICAR VERSÃO PADRÃO
# =============================================================================
echo "═══ VERIFICAR VERSΓƒO PADRΓƒO DO GCC ═══"
echo
echo "Comando:"
echo " g++ -dM -E -x c++ /dev/null | grep -i 'cplusplus'"
echo
echo "Resultado (exemplo):"
g++ -dM -E -x c++ /dev/null 2>/dev/null | grep -i 'cplusplus' || echo " #define __cplusplus 201703L // C++17"
echo
# =============================================================================
# MAKEFILE
# =============================================================================
echo "═══ EXEMPLO DE MAKEFILE ═══"
echo
cat <<'EOF'
# Makefile com seleΓ§Γ£o de versΓ£o C++
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -O2
TARGET = programa
SOURCES = main.cpp utils.cpp
OBJECTS = $(SOURCES:.cpp=.o)
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJECTS) $(TARGET)
.PHONY: all clean
EOF
echo
# =============================================================================
# CMAKE
# =============================================================================
echo "═══ EXEMPLO DE CMAKE ═══"
echo
cat <<'EOF'
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MeuProjeto)
# Define a versΓ£o do C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(programa main.cpp utils.cpp)
EOF
echo
# =============================================================================
# FEATURES POR VERSÃO
# =============================================================================
echo "═══ PRINCIPAIS FEATURES POR VERSΓƒO ═══"
echo
echo "πŸ“¦ C++11:"
echo " β€’ auto, decltype"
echo " β€’ Lambda expressions"
echo " β€’ nullptr"
echo " β€’ Range-based for"
echo " β€’ Smart pointers (unique_ptr, shared_ptr)"
echo " β€’ Move semantics (&&)"
echo " β€’ constexpr"
echo
echo "πŸ“¦ C++14:"
echo " β€’ Generic lambdas"
echo " β€’ Return type deduction"
echo " β€’ Binary literals (0b)"
echo " β€’ std::make_unique"
echo
echo "πŸ“¦ C++17:"
echo " β€’ Structured bindings (auto [a, b] = ...)"
echo " β€’ if constexpr"
echo " β€’ std::optional, std::variant, std::any"
echo " β€’ std::filesystem"
echo " β€’ Fold expressions"
echo
echo "πŸ“¦ C++20:"
echo " β€’ Concepts"
echo " β€’ Ranges"
echo " β€’ Coroutines"
echo " β€’ Modules"
echo " β€’ std::span"
echo " β€’ std::format"
echo " β€’ Three-way comparison (operator <=>)"
echo
echo "πŸ“¦ C++23:"
echo " β€’ std::print"
echo " β€’ if consteval"
echo " β€’ Multidimensional subscript operator"
echo " β€’ std::expected"
echo
# =============================================================================
# VERIFICAR SUPORTE
# =============================================================================
echo "═══ VERIFICAR SUPORTE DO GCC ═══"
echo
echo "Verificar versΓ£o do GCC instalada:"
echo " g++ --version"
echo
g++ --version 2>/dev/null | head -n1 || echo " GCC nΓ£o encontrado"
echo
echo "Testar se uma feature estΓ‘ disponΓ­vel:"
cat <<'EOF'
// test_cpp17.cpp
#if __cplusplus < 201703L
#error "Requer C++17 ou superior"
#endif
#include <iostream>
#include <filesystem>
int main() {
std::cout << "C++17 disponΓ­vel!\n";
return 0;
}
EOF
echo
echo "Compilar teste:"
echo " g++ -std=c++17 test_cpp17.cpp -o test"
echo
# =============================================================================
# DICAS
# =============================================================================
echo "═══ DICAS IMPORTANTES ═══"
echo
echo "πŸ’‘ 1. VersΓ£o padrΓ£o do GCC varia:"
echo " GCC 6-10: C++14 por padrΓ£o"
echo " GCC 11+: C++17 por padrΓ£o"
echo
echo "πŸ’‘ 2. Sempre especifique -std= em projetos:"
echo " Evita problemas de portabilidade"
echo
echo "πŸ’‘ 3. gnu++ vs c++:"
echo " -std=c++17 β†’ PadrΓ£o estrito"
echo " -std=gnu++17 β†’ Com extensΓ΅es GNU"
echo
echo "πŸ’‘ 4. Para cΓ³digo portΓ‘vel:"
echo " Use -std=c++XX (sem 'gnu')"
echo
echo "πŸ’‘ 5. Warnings ΓΊteis:"
echo " -Wall -Wextra -pedantic"
echo
# =============================================================================
# EXEMPLOS DE CΓ“DIGO
# =============================================================================
echo "═══ CΓ“DIGO DE EXEMPLO (C++17) ═══"
echo
cat <<'EOF'
// exemplo.cpp - Demonstra features C++17
#include <iostream>
#include <filesystem>
#include <optional>
// Structured binding
auto getDados() {
return std::make_tuple(42, "Hello", 3.14);
}
// std::optional
std::optional<int> buscar(bool encontrar) {
if (encontrar) return 42;
return std::nullopt;
}
int main() {
// Structured bindings
auto [num, str, pi] = getDados();
std::cout << num << " " << str << " " << pi << "\n";
// if constexpr
if constexpr (sizeof(int) == 4) {
std::cout << "int tem 4 bytes\n";
}
// std::filesystem
namespace fs = std::filesystem;
std::cout << "DiretΓ³rio atual: " << fs::current_path() << "\n";
// std::optional
if (auto resultado = buscar(true)) {
std::cout << "Encontrado: " << *resultado << "\n";
}
return 0;
}
EOF
echo
echo "Compilar:"
echo " g++ -std=c++17 exemplo.cpp -o exemplo"
echo " ./exemplo"
echo
echo "╔════════════════════════════════════════════════════════════╗"
echo "β•‘ πŸ’‘ Use -std=c++17 ou -std=c++20 para projetos modernos β•‘"
echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment