Предварителният процесор на C (cpp) исторически е свързан с C (оттук и името), но наистина е общ текстов процесор, който може да се използва (или злоупотребява) за нещо друго.
Помислете за този файл, наречен location.src (повече за това по-късно).
// 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 ;
и файл debug.src, който е включен:
#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
Когато се компилира с:
cpp -E location.src -o location.sql
получавате кода, който търсите, като cpp разширява #define стойности.
Когато се компилира с:
cpp -E -DHAVE_DEBUG location.src -o location.sql
получавате същото, плюс макроса ASSERT (публикуван като бонус, за да покажете какво може да бъде направено).
Ако приемем компилация с HAVE_DEBUG, разгърната в тестова среда (в 5.5 или по-нова, тъй като се използва SIGNAL), резултатът изглежда така:
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 ?
Обърнете внимание как името на файла, номерът на реда и условието сочат точно на мястото в изходния код в location.src, където се издига assert, отново благодарение на предварителния процесор на C.
Сега относно разширението на файла ".src":
- можете да използвате всичко.
- Наличието на различно файлово разширение помага при make файлове и т.н. и предотвратява объркване.
РЕДАКТИРАНЕ:Първоначално публикувано като .xql, преименувано на .src за яснота. Тук няма нищо свързано с xml заявки.
Както при всички инструменти, използването на cpp може да доведе до добри неща и случаят на използване за поддържане на LOCATION_LEN по преносим начин изглежда много разумен. Може също да доведе до лоши неща, с твърде много #include, вложени #ifdef hell, макроси и т.н. които накрая замъгляват кода, така че пробегът ви може да варира.
С този отговор получавате цялата работа (#define
, #include
, #ifdef
, __FILE__
, __LINE__
, #C
, опции на командния ред за изграждане), така че се надявам, че трябва да покрие всичко.