Preprocesor C (cpp) jest historycznie powiązany z C (stąd nazwa), ale tak naprawdę jest to ogólny procesor tekstu, którego można używać (lub nadużywać) do czegoś innego.
Rozważ ten plik o nazwie location.src (więcej o tym później).
// C++ style comments works here
/* C style works also */
-- plain old SQL comments also work,
-- but you should avoid using '#' style of comments,
-- this will confuse the C pre-processor ...
#define LOCATION_LEN 25
/* Debug helper macro */
#include "debug.src"
DROP TABLE IF EXISTS test.locations;
CREATE TABLE test.locations
(
`location` VARCHAR(LOCATION_LEN) NOT NULL
);
DROP PROCEDURE IF EXISTS test.AddLocation;
delimiter $$
CREATE PROCEDURE test.AddLocation (IN location VARCHAR(LOCATION_LEN))
BEGIN
-- example of macro
ASSERT(length(location) > 0, "lost or something ?");
-- do something
select "Hi there.";
END
$$
delimiter ;
oraz plik debug.src, który jest dołączony:
#ifdef HAVE_DEBUG
#define ASSERT(C, T) \
begin \
if (not (C)) then \
begin \
declare my_msg varchar(1000); \
set my_msg = concat("Assert failed, file:", __FILE__, \
", line: ", __LINE__, \
", condition ", #C, \
", text: ", T); \
signal sqlstate "HY000" set message_text = my_msg; \
end; \
end if; \
end
#else
#define ASSERT(C, T) begin end
#endif
Po skompilowaniu z:
cpp -E location.src -o location.sql
otrzymujesz kod, którego szukasz, z cpp rozwijającym #define wartości.
Po skompilowaniu z:
cpp -E -DHAVE_DEBUG location.src -o location.sql
otrzymujesz to samo, plus makro ASSERT (opublikowane jako bonus, aby pokazać, co może być gotowe).
Zakładając, że kompilacja z HAVE_DEBUG została wdrożona w środowisku testowym (w wersji 5.5 lub nowszej od czasu użycia SIGNAL), wynik wygląda tak:
mysql> call AddLocation("Here");
+-----------+
| Hi there. |
+-----------+
| Hi there. |
+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> call AddLocation("");
ERROR 1644 (HY000): Assert failed, file:location.src, line: 24, condition length(location) > 0, text: lost or something ?
Zwróć uwagę, że nazwa pliku, numer wiersza i warunek wskazują dokładnie to miejsce w kodzie źródłowym w location.src, gdzie zgłoszono potwierdzenie, ponownie dzięki preprocesorowi C.
Teraz o rozszerzeniu pliku „.src”:
- możesz użyć wszystkiego.
- Posiadanie innego rozszerzenia pliku pomaga w plikach makefile itp. i zapobiega pomyłkom.
EDYCJA:Pierwotnie opublikowany jako .xql, dla jasności zmieniono jego nazwę na .src. Nie ma tu nic związanego z zapytaniami xml.
Podobnie jak w przypadku innych narzędzi, używanie cpp może prowadzić do dobrych rzeczy, a zastosowanie obsługi LOCATION_LEN w sposób przenośny wygląda bardzo rozsądnie. Może również prowadzić do złych rzeczy, ze zbyt wieloma #include, zagnieżdżonymi #ifdef hell, makrami itp. które na końcu zaciemniają kod, więc Twój przebieg może się różnić.
Dzięki tej odpowiedzi otrzymasz wszystko (#define
, #include
, #ifdef
, __FILE__
, __LINE__
, #C
, opcje wiersza poleceń do zbudowania), więc mam nadzieję, że powinno to wszystko wyjaśnić.