Вы можете "сопоставить шаблон" со строкой, в которой находится определение, используя препроцессор Си.Чтобы сделать это полезным способом, сначала вам нужен косвенный макрос SECOND
:
#define SECOND(...) SECOND_I(__VA_ARGS__,,)
#define SECOND_I(A,B,...) B
... затем полезно иметь косвенный GLUE
:
#define GLUE(A,B) GLUE_I(A,B)
#define GLUE_I(A,B) A##B
... и, наконец, "выборочно синяя краска" original_function
на себя, если и только если она появляется на определенной строке (этот подход требует выяснения, на какой линии он находится, но я бы посоветовал не разборчиво с этим странным запросом):
#define original_function(a,b) \
SECOND(GLUE(EXCEPT_FOR_LINE_,__LINE__),replace_function)(a,b)
Таким образом, этот макрос расширит original_function
двумя аргументами с replace_function
, учитывая, что первый созданный токен не определен.Но если этот первый токен определен, то токен раскрывается первым, после чего выбирается второй аргумент для , что .Это означает, что вы можете сделать это:
#define EXCEPT_FOR_LINE_6 ,original_function
... и если original_function фактически определена в строке 6 (и не вызывается в строке 6), то окончательное расширение выглядит как оригинальное ...по строке 6;и во всех других строках он сгенерирует вызов replace_function
.
В этом примере использует эту технику в вашем коде.И в качестве бонуса, все макросы, описанные выше в этом примере, определяются в командной строке (в соответствии с вашим предполагаемым использованием в комментариях).