Перейти к основному содержимому

Компилятор Clang. Первая программа на Windows

Что такое Clang на Windows

Clang — современный компилятор C/C++, часть проекта LLVM. На Windows может использовать как собственный бэкенд, так и MinGW для совместимости с GCC.

Установка Clang на Windows

Шаг 1: Скачайте установщик с releases.llvm.org

Выберите файл: LLVM-<version>-win64.exe

Шаг 2: Запустите установщик

Шаг 3: При установке выберите "Add LLVM to the system PATH"

Шаг 4: Перезапустите терминал

Проверка установки:

clang --version

Первая программа

hello.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
printf("Hello, Windows!\n");
printf("Compiler: Clang %d.%d.%d\n",
__clang_major__, __clang_minor__, __clang_patchlevel__);

// Информация о системе
printf("Platform: ");
#ifdef _WIN32
printf("Windows 32-bit\n");
#endif
#ifdef _WIN64
printf("Windows 64-bit\n");
#endif

return 0;
}

Компиляция и запуск

Базовая компиляция

clang hello.c -o hello.exe
hello.exe

С дополнительными флагами

clang -Wall -std=c11 hello.c -o hello.exe
Совет

Clang по умолчанию создаёт файл a.exe если не указать -o. Всегда указывайте имя выходного файла!

Режимы совместимости Clang

РежимОписаниеКоманда
MSVCСовместимость с Visual Studioclang-cl hello.c
MinGWСовместимость с GCCclang --target=x86_64-w64-mingw32 hello.c
NativeНативный режим LLVMclang hello.c

Флаги компиляции

ФлагОписаниеПример
-oИмя выходного файлаclang hello.c -o program.exe
-WallВсе предупрежденияclang -Wall hello.c
-WeverythingВСЕ возможные предупрежденияclang -Weverything hello.c
-gОтладочная информацияclang -g hello.c
-O2Оптимизацияclang -O2 hello.c
-std=c11Стандарт C11clang -std=c11 hello.c
-vПодробный выводclang -v hello.c
--targetЦелевая платформаclang --target=x86_64-pc-windows hello.c

Работа с кодировкой

encoding.c
#include <stdio.h>
#include <locale.h>
#include <windows.h>

int main(void) {
// Установка UTF-8 для консоли Windows
SetConsoleCP(65001);
SetConsoleOutputCP(65001);

printf("Привет, мир!\n");
printf("Это текст на русском языке.\n");

// Математические символы
printf("Математика: π ≈ 3.14159\n");
printf("Символы: α, β, γ, δ, ε\n");

return 0;
}

Компиляция с правильной кодировкой:

clang -fexec-charset=UTF-8 encoding.c -o encoding.exe

Цветной вывод в консоль

colors.c
#include <stdio.h>
#include <windows.h>

// ANSI escape коды для цветов
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define RESET "\033[0m"

int main(void) {
// Включаем поддержку ANSI в Windows 10+
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwMode = 0;
GetConsoleMode(hOut, &dwMode);
dwMode |= 0x0004; // ENABLE_VIRTUAL_TERMINAL_PROCESSING
SetConsoleMode(hOut, dwMode);

printf(RED "Красный текст\n" RESET);
printf(GREEN "Зелёный текст\n" RESET);
printf(YELLOW "Жёлтый текст\n" RESET);
printf(BLUE "Синий текст\n" RESET);

return 0;
}

Создание простого Makefile

Makefile
CC = clang
CFLAGS = -Wall -std=c11
TARGET = program.exe
SOURCES = hello.c

$(TARGET): $(SOURCES)
$(CC) $(CFLAGS) $(SOURCES) -o $(TARGET)

clean:
del $(TARGET) 2>nul

run: $(TARGET)
$(TARGET)

debug: CFLAGS += -g
debug: $(TARGET)

release: CFLAGS += -O2
release: $(TARGET)

Использование:

:: Обычная сборка
make

:: Отладочная версия
make debug

:: Оптимизированная версия
make release

:: Запуск
make run

:: Очистка
make clean

Диагностика ошибок в Clang

Пример с ошибками

errors.c
#include <stdio.h>

int main() {
int x = 10
int y = 20;

if (x = y) {
printf("x равен y\n");
}

int arr[3] = {1, 2, 3};
printf("%d\n", arr[5]);

return 0;
}

Вывод Clang

errors.c:4:15: error: expected ';' after expression
int x = 10
^
;
errors.c:7:11: warning: using the result of an assignment as a condition
if (x = y) {
~~^~~
( )
errors.c:7:11: note: use '==' to turn this assignment into an equality comparison
if (x = y) {
^
==
Особенность

Clang показывает точное место ошибки и предлагает исправления!

Статический анализ кода

Clang имеет встроенный статический анализатор:

clang --analyze hello.c

Пример кода с потенциальными проблемами:

analyze.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
int *ptr = malloc(sizeof(int) * 10);

// Забыли проверить на NULL
ptr[0] = 42;

// Забыли освободить память
// free(ptr);

return 0;
}

Анализатор найдёт:

  • Возможное разыменование NULL
  • Утечку памяти

Сравнение Clang и GCC на Windows

АспектClangGCC (MinGW)
Сообщения об ошибках✅ Цветные, с подсказкамиТекстовые
Скорость компиляции✅ БыстрееМедленнее
Совместимость с MSVC✅ Есть режим clang-clНет
Статический анализ✅ ВстроенныйТребует плагины
Размер установки~500 MB~100 MB ✅
ОптимизацияХорошаяХорошая

Настройка VS Code для Clang

Создайте файл .vscode/tasks.json:

.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "Clang Build",
"command": "clang",
"args": [
"-g",
"-Wall",
"-std=c11",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$gcc"],
"detail": "Компиляция с Clang"
}
]
}
Горячие клавиши

Ctrl+Shift+B — запуск сборки в VS Code

Полезные команды Clang

КомандаОписание
clang --versionВерсия компилятора
clang --helpСправка по флагам
clang -print-targetsДоступные платформы
clang -print-search-dirsПути поиска
clang -### hello.cПоказать команды компиляции
clang -ftime-report hello.cВремя компиляции
clang -Xclang -ast-dump hello.cAST дерево

Дополнительные материалы