Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

C++ v Linuxu - úvod

21.11.2018

Výběr vývojového prostředí a editoru

Pro psaní a překlad programů v C/C++ potřebujeme v zásadě nějaký textový editor a překladač (kompilátor).

Základním a nejpoužívanějším překladačem C/C++ v Linuxu je GCC, proto v tomto a dalších příspěvcích na téma C++ v Linuxu jej budu používat.

Pokud jde o editor kódu nebo komplexní vývojové prostředí (IDE), je k disposici velký výběr. O tom, které IDE či editor je nejlepší najde každý na internetu dostatek flameware. Já osobně používám v současné době převážně Microsoft Visual Studio Code nebo CodeLite. Pro účely tohoto a dalších příspěvků na toto téma budu používat Microsoft Visual Studio Code s doplňkem C/C++ od Microsoftu.

Základni aplikace typu "Hello World!"

Nyní již konkrétní ukázka základní aplikace ve Visual Studio Code. Ve správci souborů si vytvoříme novou prázdnou složku pro naši aplikaci, já jsem ji nazval cpp-linux-uvod. Klikneme pravým tlačítkem a pokud se v konkrétním správci souborů objeví možnost "Otevřít s Visual Studio Code", otevřeme ji. Pokud ne, spustíme Visual Studio Code, v jeho nabídce zvolíme "Open Folder" a otevřeme naši složku.

Nyní vytvoříme nový soubor nazvaný main.cpp a napíšeme základní "hello world" aplikaci:

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

int main(int argc, char const *argv[])
{
	printf("Nějaký hloupý text...\n");
	getchar();
	return 0;
}

Překlad a sestavení aplikace

Nyní musíme program přeložit a sestavit. Z nabídky vybereme Terminal - Run Build Task, nebo stiskneme klávesovou zkratku (předpokládám výchozí nastavení) Ctrl+Shift+B. Vzhledem k tomu, že ještě nemáme příkaz pro překlad nakonfigurovaný, vybereme "...configure build task" - "Create task.json file from template" - "Others". Vytvoří se nám soubor tasks.json, který upravíme do této podoby

{
	// See https://go.microsoft.com/fwlink/?LinkId=733558
	// for the documentation about the tasks.json format
	"version": "2.0.0",
	"tasks": [
		{
			"label": "sestaveni",
			"type": "shell",
			"command": "gcc",
			"args": [
				"main.cpp",
				"-g", // debuging informace
				"-oaplikace" // nazev vystupniho souboru
			],
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}

Samozřejmě pro překlad a sestavení můžete použít libovolné vývojové prostředí nebo spustit překled z konzole příkazem:

gcc main.cpp -g -oaplikace

Nyní znovu vyvoláme task pro sestavení a program by se měl přeložit.

Spuštění a ladění programu

Nyní máme vytvořen se soubor "aplikace", který můžeme pro kontrolu spustit externě z terminálu. Pokud ale budeme chtít program spouštět a ladit přímo z Visual Studio Code, zvolíme z nabídky "Debug - Start Debugging" nebo stiskneme klávesu F5. Zde opět při prvním použití musíme nastavit úlohu pro ladění. Z možností které se nám nabízí vybereme "C++ (GDB/LLDB)". Vytvoří se nám soubor launch.json, ve kterém zatím stačí upravit pouze položku "program", kam napíšeme cestu k našemu souboru aplikace. Soubor launch.jsou bude vypadat takto:

{
	// Use IntelliSense to learn about possible attributes.
	// Hover to view descriptions of existing attributes.
	// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
	"version": "0.2.0",
	"configurations": [
		{
			"name": "(gdb) Launch",
			"type": "cppdbg",
			"request": "launch",
			"program": "${workspaceFolder}/aplikace",
			"args": [],
			"stopAtEntry": false,
			"cwd": "${workspaceFolder}",
			"environment": [],
			"externalConsole": true,
			"MIMode": "gdb",
			"setupCommands": [
				{
					"description": "Enable pretty-printing for gdb",
					"text": "-enable-pretty-printing",
					"ignoreFailures": true
				}
			]
		}
	]
}

Kódování textu - zobrazení diakritiky

Pokud jde o správně zobrazení české diakritiky, mělo by být v pořádku, protože v Linuxovém prostředí se používá UTF-8, takže pole znaků typu char je interpretováno jako UTF-8 znakový řetězec. Můžeme se o tom přesvědčit následující úpravou našeho programu:

#include <stdlib.h>
#include <stdio.h>
#include <cstring>

int main(int argc, char const *argv[])
{
	printf("Nějaký hloupý text...\n");
	char text[255];
	strcpy(text, u8"čs");
	printf("%s (%d)\n", text, (int)strlen(text));
	strcpy(text, "čs");
	printf("%s (%d)\n", text, (int)strlen(text));
	getchar();
	return 0;
}

Po přeložení a spuštění nám v obou případech funkce strlen vrátí hodnotu 3, protože znak 'č' je brán jako UTF-8 a tedy dva znaky/byty. Takže i když před textovou konstantu neuvedeme prefix u8 (deklarující UTF-8 kódování), je text interpretován v UTF-8 kódování.