Как обменять строку с индексом во время препроцессора C - PullRequest
0 голосов
/ 05 декабря 2018

У меня в нескольких операторах трассировки C-sources, таких как

TRACE(23, "abc"); 
TRACE(24, "def");

Числа 23 и 24 являются идентификаторами, отсчитываемыми из автоматически сгенерированного списка, содержащего в каждой строке одну строку

...
"abc"
"def"
...

"abc" находится в строке 23, и поэтому я пишу 23 в соответствующем операторе трассировки.

Препроцессор генерирует мне этот требуемый вывод

trace(23);
trace(24);

Я думаю, что должна быть возможность автоматизироватьэто так, что я пишу только

TRACE("abc"); 
TRACE("def");

Во время предварительной обработки C я хочу автоматически обмениваться строками с соответствующим номером строки моего сгенерированного файла, так что я получаю в выводе препроцессора

trace(23);
trace(24);

Я могу написать функцию, которая возвращает мне строку с номером 23 для строки «abc», но мне нужно активировать ее во время процесса предварительной обработки.Есть ли какие-то препроцессорные хуки или другие идеи?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Теперь у меня есть идея: пусть препроцессор сгенерирует этот вывод:

trace("abc"); 
trace("def");

Чем написать инструмент (т.е. скрипт bash с awk), обмениваясь строками с их номером строки из сгенерированного файла списка:

...
"abc"
"def"
...

И наконец, пусть компилятор сделает свою работу.Я не очень доволен этим, потому что он должен быть адаптирован для каждого компилятора.Есть идея получше?

0 голосов
/ 06 декабря 2018

Препроцессор предоставляет автоматические макросы __FILE__ и __LINE__ (и некоторые другие), которые вы можете использовать:


#include <stdio.h>

#define TRACE(m) fprintf(stderr, "%s,%d: %s\n", __FILE__ , __LINE__, m)

int main(void)
{
int a;

if(a) TRACE("a");
else TRACE("no");

TRACE("returning");

return 0;
}
...