|
#!/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 "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |