LINUX.ORG.RU

История изменений

Исправление 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* и не вытаскивая мусор со стека.