Как получить путь к файлу, который вызывает данную функцию

Рейтинг: 1Ответов: 1Опубликовано: 10.02.2023

Мне нужно сделать так, чтобы я мог получить путь к файлу который вызывает функцию и эта функция могла работать с данным путем (желательно это сделать максимально автоматизированным, то есть чтобы не надо было вводить что-либо в аргументы функции)

Например: есть стандартный файл main.cpp и файлы test.h и test.cpp(например)

test.h:

#pragma once

class Test{
public:
    static void getPath();
};

test.cpp:

#include "test.h"

void Test::getPath(){
    // Как-то получить путь к файлу, в данном случае путь к main.cpp (так как вызывает эту функцию он)

    // Какие-то действия с этим путем
}

main.cpp:

#include "test.h"

int main(){
   Test::getPath();

   return 0;
} 

Извиняюсь за возможные ошибки в коде (я набирал его на телефоне и здесь)

C++17, компилятор я не помню, но IDE - Visual Studio 22

Ответы

▲ 1Принят

В C++20:

#include <iostream>
#include <source_location>

int sum(int x, int y, std::source_location loc = std::source_location::current())
{
    std::cout << loc.file_name() << '\n';
    return x + y;
}

int main()
{
    sum(1, 2);
}

С помощью нестандартной функции __builtin_FILE(), которая, тем не менее, работает на всех основных компиляторах: Clang, GCC, MSVC.

#include <iostream>

int sum(int x, int y, const char *filename = __builtin_FILE())
{
    std::cout << filename << '\n';
    return x + y;
}

int main()
{
    sum(1, 2);
}

По-стариковски, через макрос. Такое работает даже в С.

#include <iostream>

int sum(const char *filename, int x, int y)
{
    std::cout << filename << '\n';
    return x + y;
}

#define SUM(...) sum(__FILE__, __VA_ARGS__)

int main()
{
    SUM(1, 2);
}