C/Program
Składniki programu
- znaki
- słowa ( kluczowe C, nazwy zmiennych i stałych[1] )
- linie ( fragmenty kodu, wyrażenia, instrukcje, dyrektywy preprocesora[2], komentarze 1-liniowe)
- sekcje (podprogramy procedury, funkcje , wyrażenia, instrukcje, komentarze wielo-liniowe)
- pliki ( moduły, biblioteki, pliki źródłowe, programy )
Zobacz również:
Zestaw znaków i kodowanie
w programie
Zestaw znaków dopuszczalnych w programie [6]
- A - Z ( duże litery, ang. capital letters)
- a -z ( małe litery, ang. small letters)
- 0 - 9 ( cyfry, ang. digits)
- znaki specjalne ( ang. Special Characters)
- space . , : ; ' $ " (
- # % & ! _ {} [] () $ & |
- + - / * = ? < >
jest fragmentem znaków ASCII i UTF-8 (ASCII jest podzbiorem UTF-8).
Z punktu widzenia kodowania plik źródłowy w c jest to tekst zakodowany w ASCII[7] (UTF-8[8]) z rozszerzeniem c lub h. Oczywiście w c można przetwarzać tekst zakodowany w innych systemach, jak UTF[9]
Problemem mogą być:
- znaki końca linii (ang. line-endings) [10]
- CRLF =
\r\n
(Windows) - LF =
\n
(Linux)
- CRLF =
- Null
- kopiowanie i wklejanie
w nazwach (identyfikatorach)
Identyfikator ( nazwa) :
- zmiennej
- funkcji
- struktury
Jest to podzbiór zbioru znaków dopuszczalnych w programie:[11]
- A - Z ( duże litery, ang. capital letters)
- a -z ( małe litery, ang. small letters)
- 0 - 9 ( cyfry, ang. digits)
- Underscore(_)
Użycie pozostałych znaków w nazwie zmiennej jest niedozwolone. Np. użycie
font-size // dopuszczalne w svg
powoduje błąd.
plik/katalog
Znaki niedopuszczalne w nazwach:
- pliku
- katalogu[12]
Słowa kluczowe
Lista słów kluczowych języka C na podstawie normy ISO/IEC 9899:2011 (C11).
auto
|
extern
|
short
|
while
|
break
|
float
|
signed
|
_Alignas
|
case
|
for
|
sizeof
|
_Alignof
|
char
|
goto
|
static
|
_Atomic
|
const
|
if
|
struct
|
_Bool
|
continue
|
inline
|
switch
|
_Complex
|
default
|
int
|
typedef
|
_Generic
|
do
|
long
|
union
|
_Imaginary
|
double
|
register
|
unsigned
|
_Noreturn
|
else
|
restrict
|
void
|
_Static_assert
|
enum
|
return
|
volatile
|
_Thread_local
|
wersja
Jak oznaczać nowe wersje programu ? ( ang. Software versioning[13] )
dokumentacja
Komentarze
Typy
- wg wielkości
- 1 liniowe ( Single-line Comments)
- wieloliniowe ( Multi-line Comments )
- wg formy:
- //
- /**/
//Single Line Comments (added by C99 standard, famously known as c++ style of comments)
/*
Multi-Line Comments
(only form of comments supported by C89 standard)
*/
Cel
- Zamiast komentarzy używaj znaczących nazw funkcji i zmiennych
- komentarz jako symbolem zastępczy
- komentarz jako dokumentacja kodu
Formatowanie kodu i style programowania
Zasady ( Standardy kodowania):
- Style guide for C programming in Systems Architecture by Carlos III University of Madrid
- stackoverflow question: coding-standards-for-pure-c
- Notes on Programming in C by Rob Pike, February 21, 1989
- Artistic Style code formatter by Andre Simon
- jednolity standard [14]
- GNU[15]
- CERT Coding Standards[16]
- MISRA_C – standard budowania aplikacji w języku C stworzony przez Motor Industry Software Reliability Association (MISRA) utworzony w celu zapewnienia przejrzystości i przenośności kodu źródłowego, głównie z myślą o systemach mikroprocesorowych programowanych w C. Standard MISRA C został stworzony z myślą o przemyśle samochodowym. Obecnie jednak jest podstawowym standardem tworzenia oprogramowania we wszelkich systemach, które wymagają dużej niezawodności m.in. przemysł lotniczy, kolejowy, medyczny, telekomunikacyjny oraz militarny.
Narzędzia / programy:
Wcięcia (ang. Indent style[17]):
- kernel [18]
- K&R
- GNU
Automatyczne formatowanie:
- style Emacsa (automatyczne formatowanie) [19]
Wbudowane style Emacsa dla c:
- gnu : domyślny styl dla c w Emacsie ( używany przez FSF w programach GNU )[20]
- k&r : klasyczny styl Kernighana i Ritchiego dla C
- bsd : styl Allman'a ( Eric Allman ) - - nawiasy klamrowe otwierające blok znajdują się w osobnej linii
- whitesmith : styl z przykładów Whitesmiths C, wczesnego komercyjnego kompilatora
- linux : dla C wg standardów Linuksa (jądro).
API
W języku C definicja interfejsu programowania aplikacji ( ang. API) [21] składa się przede wszystkim z listy dostępnych funkcji (w formie prototypów funkcji), wraz z towarzyszącymi im przeważnie definicjami stałych, zmiennych oraz struktur danych, które mogą być użyte jako ich parametry. Przykładowa lista prototypów funkcji z API biblioteki standardowej języka C (plik nagłówkowy <stdio.h>) to:
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
W prototypach funkcji (printf
, fprintf
, sprintf
, snprintf
) użyte są identyfikatory struktur i typów (FILE
i size_t
), które są również częścią definicji API (ich definicja nie została zamieszczona w przykładzie).
Przykład użycia jednej z powyższych funkcji z API jest następujący:
return printf("Hello world");
Typy programów
Typy programów wg liczby składników:
- proste (tylko 1 plik źródłowy)
- złożone
Typy wg interfejsu użytkownika:
- wiersz poleceń (CLI) – urządzenie wejściowe to klawiatura, a wyjściowe to drukarka lub wyświetlacz w trybie znakowym
- graficzny interfejs użytkownika (GUI)[22] – wejście to urządzenie wskazujące (zwykle myszka), a wyjście to wyświetlacz graficzny,
- interfejs strony internetowej (WUI) – wejście i wyjście jest realizowane poprzez stronę internetową wyświetlaną w przeglądarce,
- interfejs głosowy (VUI) – urządzenie wejściowe to mikrofon, a wyjściowe to głośniki,
- interfejs gestowy – urządzenie wejściowe to ciało ludzkie lub specjalny kontroler, a wyjściowe to wyświetlacz graficzny; przykładem jest Kinect dla konsoli Xbox 360,
- rzeczywistość wirtualna – może używać elementów interfejsu głosowego i gestowego. Wejściem są gesty i ruchy głowy, np. dzięki specjalnym okularom oraz rękawicom a wyjściem obraz wyświetlany w okularach,
- rzeczywistość rozszerzona – także jest interfejsem gdzie rzeczywistość widziana oczyma, jest ulepszana dzięki technologii, np. okularów czy smartfonów.
Program prosty
- minimalny
- Hello world czyli Witaj świecie !
Jaki jest minimalny program ?
Najmniejszy program, który daje się skompilować i uruchomić:
void main(){}
Jeśli skompilujemy :
gcc m.c -Wall
to otrzymujemy ostrzeżenie ( nie błąd) :
m.c:1:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
void main(){}
Rozwiązanie: zmienić typ wyniku funkcji main na int[23]
int main(){
return 0;}
Teraz program kompiluje i wykonuje się bez problemów
Struktura
Struktura wg Erika O'Shaughnessy[24]
/* main.c */
/* 0 copyright/licensing */
/* 1 includes */
/* 2 defines */
/* 3 external declarations */
/* 4 typedefs */
/* 5 global variable declarations */
/* 6 function prototypes */
int main(int argc, char *argv[]) {
/* 7 command-line parsing */
}
/* 8 function declarations */
Program złożony
Składniki programu złożonego:
- główny plik programu (źródłowy):
main.c
zawierający specjalną funkcję main() - dodatkowe pliki źródłowe (moduły = jednostki translacji)[25]
- tylko c
- c i h
- biblioteki = pliki nagłówkowe (.h) oraz pliki binarne (skompilowane)
- dodatkowe pliki inne niż źródłowe
- pliki kompilacji: Makefile
- pliki graficzne
- pliki z danymi
Kiedy program powinien być podzielony na mniejsze pliki ? ( opinie, nie bezwględne zalecenia)
- gdy można program podzielić na odrębne problemy programistyczne ( moduły, biblioteki )
- gdy program jest długi ( np. więcej niż 1000 linii )
Jak zbudować wieloplikowy program w C?[26]
Jak działa program ?
Analiza programu z użyciem dodatkowych narzędzi
- zależności
- debugowanie
- analiza kodu
Komunikacja
Elementy otoczenia programu ( srodowisko, system operacyjny)
- plik ( na dysku)
- urządzenia takie jak terminal
- potok
- gniazda
- procesy
Dwa podstawowe mechanizmy połączenia między programem jego otoczeniem [27]
- deskryptory plików ( ang. file Descriptors). Deskryptory plików są reprezentowane jako obiekty typu int. Deskryptory plików zapewniają prymitywny, niskopoziomowy interfejs do operacji wejścia i wyjścia.
- strumienie ( ang. stream). Strumienie są reprezentowane jako obiekty FILE *.
Źródła
- ↑ studytonight.com: c keywords-and-identifier
- ↑ Można napisać program bez dyrektyw preprocesora. Np.:
void main(){}
, ale wtedy mamy ostrzeżenie: . Zwykle nawet mały program zawiera przynajmniej 1 dyrektywę. - ↑ Dead code in english wikipedai
- ↑ stackoverflow question: how-to-find-dead-code-in-c-language-project-with-gcc-compiler ?
- ↑ Dead-code_elimination in english wikipedia
- ↑ C's Character Set by Richard Mobbs
- ↑ stackoverflow question: ascii-english-text-ascii-c-program-text-question
- ↑ 21st-century-c-2nd-edition: the_encoding_for_c_code
- ↑ Unicode in C and C++: What You Can Do About It Today by Jeff Bezanson
- ↑ wikipedia:en:Newline#In_programming_languages
- ↑ c4learn : c-variable-nameing-rules
- ↑ stackoverflow question: hat-characters-are-forbidden-in-windows-and-linux-directory-names
- ↑ Software versioning w ang wikipedii
- ↑ [http://www.forbot.pl/forum/topics20/programowanie-sekrety-profesjonalnego-programowania-vt9172.htm Programowanie: Sekrety profesjonalnego programowania - Gandalf]
- ↑ GNU Coding Standards
- ↑ CERT C Coding Standard
- ↑ Indent_style - angielska Wikipedia
- ↑ Kernel coding style
- ↑ wcięcia w c - Emacs
- ↑ GCC wiki : FormattingCodeForGCC
- ↑ API
- ↑ Graficzny interfejs użytkownika w wikipedii
- ↑ stackoverflow question: what-should-main-return-in-c-and-c
- ↑ opensource article : how-write-good-c-main-function
- ↑ A guide to include several files in a C program Published by One Step! Code on January 30, 2021
- ↑ opensource article: structure-multi-file-c-program By Erik O'Shaughnessy
- ↑ stackoverflow question: what-is-the-difference-between-a-stream-and-a-file