Sklejanie wierszy kodu w C++

2010-04-06 22:24

Języki programowania o składni podobnej do C nie narzucają specjalnych ograniczeń na to, jak pisany w nich kod formatujemy wizualnie. Możemy więc robić dowolne wcięcia, a także w dowolny sposób dzielić poszczególne instrukcje między wiersze w pliku źródłowym. Jest tak dlatego, że to inne znaki – jak średniki czy nawiasy klamrowe – nadają listingowi strukturę odczytywaną przez kompilator.

W C/C++ są jednak przynajmniej dwie sytuacje, w których “fizyczne” wiersze w pliku z kodem mają znaczenie. Przekonał się o tym każdy, kto próbował zdefiniować (dyrektywą #define) makro rozciągające się na kilka linijek. Ściśle rzecz ujmując, w ogóle nie da się tego zrobić – dyrektywy preprocesora z założenia zajmują zawsze dokładnie jeden wiersz. Można jednak sprawić, by ów wiersz… rozciągał się na kilka linijek:

  1. #define FUNCTOR(name,params,code) class name { \
  2.     public: \
  3.         void operator()(params) \
  4.             code \
  5. };
  6. // disclaimer: nie należy zakładać, że powyższe makro
  7. // ma jakikolwiek praktyczny sens ;)

Znak \ (backslash) robi właśnie ten rodzaj magii. “Skleja” on mianowicie dwie linijki kodu tak, że dla kompilatora stają się one jedną. Używając go, możemy więc rozbić makro preprocesora na wiele wierszy.

Druga sytuacja, w której tak stosowany backslash jest przydatny, to długie ciągi znaków pisane w kodzie:
std::cout << "To jest bardzo długi komunikat, który w konsoli pojawi się \ w pojedynczym wierszu mimo tego, że tutaj w pliku źródłowym jest on podzielony \ na kilka następujących po sobie linijek." << std::endl;[/cpp] Potrafi on bowiem także "oszukać cudzysłów". Jednak identyczny efekt można też osiągnąć, jeśli wiemy, że kompilator sam skleja następujące po sobie napisy. “a” “b” daje na przykład to samo "ab". Dlatego też backslash w wielolinijkowych napisach jest stosunkowo rzadko używany.

Tags:
Author: Xion, posted under Programming »


3 comments for post “Sklejanie wierszy kodu w C++”.
  1. Kacper Kołodziej:
    April 7th, 2010 o 13:41

    Choć krótkie, to bardzo przydatne. To, że formatowanie kodu w takich językach jak C++ czy PHP nie ma znaczenia, wiedziałem, ale sposobu na “sklejanie” nie znałem. Jednak każdy przyzna, że lepiej jest odpowiednio formatować kod. Nie tylko dzieląc go na linijki, ale także dodając wcięcia. Na pewno pomaga to w późniejszej analizie kodu, a kosztuje niewiele pracy (czasem nawet edytory kodu czynią za nas 90% roboty (wcięcia i cofnięcia nawiasów klamrowych – przy zamykaniu).

  2. Xion:
    April 7th, 2010 o 15:38

    Dlatego właśnie \ w wielolinijkowych napisach nie jest używane tak często, bo powodowałoby włączenie do stringa wszystkiego od początku kolejnego wiersza – trochę jak <pre> w HTML-u – a więc również ewentualne wcięcia.

    No a inna sprawa jest taka, że umieszczanie długich napisów w samym kodzie jest w ogóle podejrzaną praktyką…

  3. lmmilewski:
    April 10th, 2010 o 13:17

    Pamiętam jak kiedyś używałem tego znaku w makrach, aż pewnego dnia zakomentowałem jedną z takich linijek ;-)

    Niestety znak \ na końcu komentarza (tego //) przedłuża go na następną linię.

    Trochę czasu wtedy zmarnowałem. Od tego czasu nie używam makr (i znaku \ ) ;-)

Comments are disabled.
 


© 2018 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.