История изменений
Исправление vbr, (текущая версия) :
Ты с C++ не перепутал?
Не перепутал.
Строковые литералы ты макросами не распарсишь никак. Да и представь что будет если строка формата - не литерал вообще, а переменная.
Тебе не надо парсить строковые литералы макросами. Тебе надо передать аргументы в логику форматтера типобезопасно. Чтобы форматтер знал, когда в строке %s, а аргумент int (или аргумента вообще нет) и обработал эту ситуацию тем или иным образом, но уж точно не интерпретируя int как char* и не вытаскивая мусор со стека.
И вот variadic macros плюс generics позволяют эту информацию о реальных типах параметров доставить в логику форматтера.
Я, если что, не утверждаю, что код PRINTF("%s", (int) i)
будет падать при компиляции. Конечно он будет возвращать ошибку во время выполнения (или иным способом обрабатывать эту ситуацию, например просто печатая число в виде строки).
Исправление vbr, :
Ты с C++ не перепутал?
Не перепутал.
Строковые литералы ты макросами не распарсишь никак. Да и представь что будет если строка формата - не литерал вообще, а переменная.
Тебе не надо парсить строковые литералы макросами. Тебе надо передать аргументы в логику форматтера типобезопасно. Чтобы форматтер знал, когда в строке %s, а аргумент int (или аргумента вообще нет) и обработал эту ситуацию тем или иным образом, но уж точно не интерпретируя int как char* и не вытаскивая мусор со стека.
И вот variadic macros плюс generics позволяют эту информацию о реальных типах параметров доставить в логику форматтера.
Исходная версия vbr, :
Ты с C++ не перепутал?
Не перепутал.
Строковые литералы ты макросами не распарсишь никак. Да и представь что будет если строка формата - не литерал вообще, а переменная.
Тебе не надо парсить строковые литералы макросами. Тебе надо передать аргументы в логику форматтера типобезопасно. Чтобы форматтер знал, когда в строке %s, а аргумент int (или аргумента вообще нет) и обработал эту ситуацию тем или иным образом, но уж точно не интерпретируя int как char* и не вытаскивая мусор со стека.