На самом деле вопрос не по С++, а скорее по LLVM, но мне кажется, что по смыслу лучше задать именно здесь.
hello.h:
extern"C" int f(int i);
#define F(x) f(\
f(\
f(\
f(\
x))))
hello.cpp:
#include "hello.h"
int main(int argc, char** argv)
{
int x=F(42);
return x+5;
}
Далее
clang hello.cpp -o hello.ll -S -emit-llvm -target i386-pc-windows -g
В лл вижу
%7 = call i32 @f(i32 42), !dbg !19
%8 = call i32 @f(i32 %7), !dbg !19
%9 = call i32 @f(i32 %8), !dbg !19
%10 = call i32 @f(i32 %9), !dbg !19
то есть всё тело макроса относится к одной дебаг локации
Это значит, что я не могу поставить брекпоинт внутрь макроса в любое место.
На самом деле я сто лет не писал на крестах, я принимаю участие в разработке собственного убийцы С++, где такое макропрограммирование вовсю используется в метапрограммировании наряду с шаблонами, статической генерацией текста программы итд.
И я не знаю, как мне генерить дебаг инфу.
Я при развороте тела макроса честно прописываю строку и колонну каждого токена. Но если макрос находится в другом файле, то отладчик итерируется по линиям и колоннам не того файла, в котором макрос, а того файла, который вызвал макрос. Потому что codeview (мне нужен именно он, так как мсвс) не позволяет задавать каждой инструкции свой файл.
Если ли компилятор/отладчик, который позволяет ставить брекпоинты внутри макроса? И как выглядит его отладочная инфа?
Как в том же D выглядит отладка кода, находящегося в сгенерированной строке?