W kodzie funkcji
void
E_main_I_help( Pc exe_name
){ N s_l = 7 + E_text_Z_s0_R_l( exe_name ) + 30 + 1;
Pc s = M( s_l );
if( !s )
{ GV_(NA);
return;
}
E_text_Z_s_P_copy_s0_0( E_text_Z_s_P_copy_s0( E_text_Z_s_P_copy_s0( s, "usage: " ), exe_name ), " [ -r ] [ root_path ... ]" );
G_(); Gs0_(s);
W(s);
}
są wykonywane następujące działania:
- Obliczenie rozmiaru docelowego bloku pamięci na tekst zakończony znakiem
'\0'
. - Przydzielenie bloku pamięci na o tym rozmiarze.
- Skopiowanie wymaganych tekstów do tego bloku pamięci.
- Wypisanie tekstu.
- Zwolnienie wcześniej przydzielonego bloku pamięci.
Pytanie jest następujące: jak umożliwić kompilatorowi samodzielne obliczenie rozmiaru bloku pamięci na tekst?
Tak by było tylko jedno miejsce umieszczenia tekstów stałych oraz jedno miejsce przydzielenia bloku pamięci.
Pytanie dotyczy C, ale każdy pomysł w innym języku (jak np. C++) jest przydatny.
I nie należy się sugerować tutaj podanym przypadkiem, że tekst jest wypisywany, więc można by w C++ użyć format
na standardowe wyjście. Tekst nie musi być wypisywany.
Pod koniec pisania tego ‘posta’ przypomniał mi się jeszcze sposób, jaki stosuję na przykład do obliczania rozmiaru bloku potrzebnego na tekst w funkcji formatującej tekst do postaci otoczonego znakami komentarza argumentu wiersza poleceń: dwie funkcje, jedna do obliczania rozmiaru bloku, druga do tworzenia tekstu w tym bloku.
Wtedy to wyglądałoby tak:
void
E_main_I_help( Pc exe_name
){ N s_l = E_text_Z_s_P_copy_s0_0_G( E_text_Z_s_P_copy_s0_G( E_text_Z_s_P_copy_s0_G( s, "usage: " ), exe_name ), " [ -r ] [ root_path ... ]" );
Pc s = M( s_l );
if( !s )
{ GV_(NA);
return;
}
E_text_Z_s_P_copy_s0_0( E_text_Z_s_P_copy_s0( E_text_Z_s_P_copy_s0( s, "usage: " ), exe_name ), " [ -r ] [ root_path ... ]" );
G_(); Gs0_(s);
W(s);
}
Ale wtedy muszę w dwóch miejscach podawać te same teksty.
A chodzi o zachowanie zwięzłości kodu.