-
-
Notifications
You must be signed in to change notification settings - Fork 0
Language Standards Support
CppLab IDE supports multiple C and C++ language standards, allowing developers to write both legacy and modern code.
| Standard | Flag | Year | Status | Description |
|---|---|---|---|---|
| C99 | -std=c99 |
1999 | Stable | Legacy support, inline functions, // comments |
| C11 | -std=c11 |
2011 | Stable | Multi-threading, _Generic, anonymous structs |
| C17 | -std=c17 |
2018 | Default | Bug-fix update to C11, most stable |
| C18 | -std=c18 |
2018 | Stable | Alias for C17 |
| C23 | -std=c23 |
2023 | Experimental | Digit separators, typeof, constexpr
|
| Standard | Flag | Year | Status | Description |
|---|---|---|---|---|
| C++11 | -std=c++11 |
2011 | Stable |
auto, nullptr, lambdas, move semantics |
| C++14 | -std=c++14 |
2014 | Stable | Generic lambdas, relaxed constexpr
|
| C++17 | -std=c++17 |
2017 | Default | Structured bindings, if constexpr, std::optional
|
| C++20 | -std=c++20 |
2020 | Stable | Concepts, ranges, coroutines, modules |
| C++23 | -std=c++23 |
2023 | Experimental | Deducing this, multidimensional subscript |
- C Projects: Default to C17 (most stable modern C)
- C++ Projects: Default to C++17 (widely supported, stable)
-
.cfiles: Default to C17 -
.cppfiles: Default to C++17
Location: Main window toolbar, next to Toolchain selector
┌──────────────────────────┐
│ Standard: ▼ │
├──────────────────────────┤
│ C++23 │ ← For .cpp files
│ C++20 │
│ C++17 ← Default │
│ C++14 │
│ C++11 │
└──────────────────────────┘
┌──────────────────────────┐
│ Standard: ▼ │
├──────────────────────────┤
│ C23 │ ← For .c files
│ C18 │
│ C17 ← Default │
│ C11 │
│ C99 │
└──────────────────────────┘
Behavior:
- Dropdown options change based on file extension
- Selection persists for:
-
Projects: Saved to
cpplab_project.json - Standalone: Saved in session (not persisted)
-
Projects: Saved to
File: <project_root>/cpplab_project.json
{
"name": "MyProject",
"language": "cpp",
"standard": "c++20",
...
}Manual Edit:
// Change from C++17 to C++20
"standard": "c++20"Reload: Close and reopen project
When creating a new project:
┌─────────────────────────────────┐
│ Create New Project │
├─────────────────────────────────┤
│ Language: ◉ C++ ○ C │
│ │
│ Standard: [C++17 ▼] │
│ ┌──────────────┐ │
│ │ C++23 │ │
│ │ C++20 │ │
│ │ C++17 ← │ │
│ │ C++14 │ │
│ │ C++11 │ │
│ └──────────────┘ │
│ │
│ Type: ◉ Console │
│ ○ Graphics │
└─────────────────────────────────┘
File: src/cpplab/app.py
def _update_standard_combo_for_language(self, language: str,
current_standard: Optional[str] = None):
"""Update standard combo box based on language."""
self.standardComboBox.blockSignals(True)
self.standardComboBox.clear()
if language == "c":
# C standards (newest first)
self.standardComboBox.addItem("C23", "c23")
self.standardComboBox.addItem("C18", "c18")
self.standardComboBox.addItem("C17", "c17")
self.standardComboBox.addItem("C11", "c11")
self.standardComboBox.addItem("C99", "c99")
default = current_standard or "c17"
else: # cpp
# C++ standards (newest first)
self.standardComboBox.addItem("C++23", "c++23")
self.standardComboBox.addItem("C++20", "c++20")
self.standardComboBox.addItem("C++17", "c++17")
self.standardComboBox.addItem("C++14", "c++14")
self.standardComboBox.addItem("C++11", "c++11")
default = current_standard or "c++17"
# Set current selection
for i in range(self.standardComboBox.count()):
if self.standardComboBox.itemData(i) == default:
self.standardComboBox.setCurrentIndex(i)
break
self.standardComboBox.blockSignals(False)Based on File Extension:
def detect_language(file_path: Path) -> str:
"""Detect language from file extension."""
if file_path.suffix in ['.c', '.h']:
return 'c'
elif file_path.suffix in ['.cpp', '.cc', '.cxx', '.hpp', '.hxx']:
return 'cpp'
else:
return 'cpp' # Default to C++| Feature | C99 | C11 | C17/18 | C23 |
|---|---|---|---|---|
// comments |
[x] | [x] | [x] | [x] |
inline functions |
[x] | [x] | [x] | [x] |
| Variable-length arrays | [x] | [x] | [x] | [x] |
_Bool type |
[x] | [x] | [x] | [x] |
<stdint.h> |
[x] | [x] | [x] | [x] |
_Generic |
❌ | [x] | [x] | [x] |
_Static_assert |
❌ | [x] | [x] | [x] |
_Atomic |
❌ | [x] | [x] | [x] |
_Thread_local |
❌ | [x] | [x] | [x] |
| Digit separators | ❌ | ❌ | ❌ | [x] |
typeof |
❌ | ❌ | ❌ | [x] |
constexpr |
❌ | ❌ | ❌ | [x] |
| Feature | C++11 | C++14 | C++17 | C++20 | C++23 |
|---|---|---|---|---|---|
auto |
[x] | [x] | [x] | [x] | [x] |
nullptr |
[x] | [x] | [x] | [x] | [x] |
| Lambdas | [x] | [x] | [x] | [x] | [x] |
| Move semantics | [x] | [x] | [x] | [x] | [x] |
<thread> |
[x] | [x] | [x] | [x] | [x] |
| Generic lambdas | ❌ | [x] | [x] | [x] | [x] |
Relaxed constexpr
|
❌ | [x] | [x] | [x] | [x] |
| Structured bindings | ❌ | ❌ | [x] | [x] | [x] |
if constexpr |
❌ | ❌ | [x] | [x] | [x] |
std::optional |
❌ | ❌ | [x] | [x] | [x] |
| Concepts | ❌ | ❌ | ❌ | [x] | [x] |
| Ranges | ❌ | ❌ | ❌ | [x] | [x] |
| Coroutines | ❌ | ❌ | ❌ | [x] | [x] |
Deducing this
|
❌ | ❌ | ❌ | ❌ | [x] |
| Multidim subscript | ❌ | ❌ | ❌ | ❌ | [x] |
// test_c17.c
#include <stdio.h>
#include <stdint.h>
int main(void) {
// C11 _Generic macro
#define TYPE_NAME(x) _Generic((x), \
int: "int", \
float: "float", \
default: "unknown")
int x = 42;
printf("Type: %s\n", TYPE_NAME(x));
return 0;
}Build:
gcc test_c17.c -std=c17 -o test.exe// test_c23.c
#include <stdio.h>
int main(void) {
// Digit separators (C23)
int million = 1'000'000;
// typeof (C23)
typeof(million) another = million;
printf("Million: %d\n", million);
printf("Another: %d\n", another);
return 0;
}Build:
gcc test_c23.c -std=c23 -o test.exeNote: May not work with older GCC versions
// test_cpp17.cpp
#include <iostream>
#include <tuple>
#include <optional>
auto divide(int a, int b) -> std::optional<int> {
if (b == 0) return std::nullopt;
return a / b;
}
int main() {
// Structured bindings (C++17)
auto [x, y, z] = std::tuple{1, 2, 3};
// if constexpr (C++17)
if constexpr (sizeof(int) == 4) {
std::cout << "32-bit ints\n";
}
// std::optional (C++17)
if (auto result = divide(10, 2)) {
std::cout << "Result: " << *result << "\n";
}
return 0;
}Build:
g++ test_cpp17.cpp -std=c++17 -o test.exe// test_cpp20.cpp
#include <iostream>
#include <concepts>
#include <ranges>
#include <vector>
// Concepts (C++20)
template<std::integral T>
auto square(T value) {
return value * value;
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
// Ranges (C++20)
auto even = nums | std::views::filter([](int n) { return n % 2 == 0; });
for (int n : even) {
std::cout << n << " ";
}
std::cout << "\nSquare of 5: " << square(5) << "\n";
return 0;
}Build:
g++ test_cpp20.cpp -std=c++20 -o test.exe// test_cpp23.cpp
#include <iostream>
struct Matrix {
int data[3][3];
// Deducing this (C++23)
auto operator[](this auto&& self, int i, int j) {
return self.data[i][j];
}
};
int main() {
Matrix m = {{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}};
// Multidimensional subscript (C++23)
std::cout << "m[1][1] = " << m[1, 1] << "\n";
return 0;
}Build:
g++ test_cpp23.cpp -std=c++23 -o test.exeNote: Requires GCC 12+ or similar
| Standard | Minimum GCC | Bundled GCC | Status |
|---|---|---|---|
| C99 | 3.0+ | 8.1.0 | [x] Full |
| C11 | 4.7+ | 8.1.0 | [x] Full |
| C17/C18 | 5.0+ | 8.1.0 | [x] Full |
| C23 | 13.0+ | 8.1.0 | |
| C++11 | 4.8+ | 8.1.0 | [x] Full |
| C++14 | 5.0+ | 8.1.0 | [x] Full |
| C++17 | 7.0+ | 8.1.0 | [x] Full |
| C++20 | 10.0+ | 8.1.0 | |
| C++23 | 12.0+ | 8.1.0 | ❌ Minimal |
Fully Supported (Bundled GCC 8.1.0):
- C99, C11, C17/C18
- C++11, C++14, C++17
Partially Supported:
⚠️ C++20: Most features work, some experimental⚠️ C23: Basic features, advanced features missing
Limited Support:
- ❌ C++23: Very limited, many features unavailable
For Maximum Compatibility:
- Use C17 for C projects
- Use C++17 for C++ projects
For Modern Features:
- Use C++20 (test thoroughly)
- Avoid C23 and C++23 unless you know the bundled GCC supports specific features
Cause: Using features not available in bundled GCC
Solution: Downgrade to C++17 or C17
Cause: Using C++20 feature but standard not set
Solution: Set standard to C++20 in dropdown
Cause: Bundled GCC too old for C++23
Solution: Use C++20 or C++17 instead
Next: Project vs Standalone Mode
Previous: Compiler & Toolchain Configuration
💡 Found this wiki useful?
⭐ Star the repo
·
💖 Sponsor this project
·
📦 Latest release
·
🐞 Report an issue