c++ - 是否有可能获得在 GCC 中编译的函数的名称?

标签 c++ gcc

<分区>

抱歉,我什至不知道该怎么问。

我想生成一些正在运行的方法或函数的跟踪日志,但我不想在每个方法中都写命令名称(我真的很懒!)。

例子:

我当前的代码:

void doSomething() {
    TRACE("doSomething");
    // now do something!
    system("pause");
}

我想做的事情:

void doSomething() {
    TRACE;
    // do something!
    system("pause");
}

(两个程序的)预期输出:

doSomething
Press any key to continue...

如果您需要我说得更清楚,请告诉我。我会尽量说清楚。

最佳答案

我会从这样的事情开始:

#define TRACE(message) TRACE_IMPL(__FILE__, __LINE__, __PRETTY_FUNCTION__, message)

void TRACE_IMPL(const char *file, int line, const char *function, const char *message) {
    ...
}

int main() {
    TRACE("help");
}

我的下一步是将消息更改为格式字符串,并在 Trace 上启用 printf() 样式的 va_args。这看起来像:

#include <cstdio>
#include <stdarg.h>

#define TRACE(format, ...) TRACE_IMPL("File: %s Line: %d Function: %s Message: " format "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)

void TRACE_IMPL(const char *format, ...) {
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    va_end(args);
}

int main() {
    TRACE("help");
    TRACE("Canary %d", 2);
}

哪个会输出:

[8:18pm][wlynch@watermelon /tmp] ./foo
File: foo.c Line: 14 Function: int main() Message: help
File: foo.c Line: 15 Function: int main() Message: Canary 2

如果需要,您也可以使用 C++ 流:

#include <iostream>

#define TRACE LogImpl(__FILE__, __LINE__, __PRETTY_FUNCTION__)

class LogImpl {
    public:
        LogImpl(const char *file, int line, char *function) {
            std::cout << "File: " << file << " Line: " << line << " Function: " << function << " Message: ";
        }

        ~LogImpl() {
            std::cout << "\n";
        }

        LogImpl(LogImpl const &) = delete;
        LogImpl & operator=(LogImpl const &) = delete;

        template <typename T>
        LogImpl & operator<<(T const & obj) {
            std::cout << obj;
            return *this;
        }
};

int main() {
    TRACE << "help";
    TRACE << "Canary " << 2;
}

关于c++ - 是否有可能获得在 GCC 中编译的函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24005479/

相关文章:

c++ - 在 C++ 中定义多个组合对象的最佳方式?

c++ - Linux 进程文件包含哪些内容?

c++ - 有哪些用 Qt 编写的可以在 OSX 和 Windows 上运行的应用程序?

c++ - 取消分配从函数返回的 char*

c - arm7tdmi汇编讲解+崩溃调试

c++ - “输入”未命名类型错误。不知道为什么吗?

C 结构初始化完成 "recursively"

C++ 静态初始化 vs __attribute__((constructor))

复制文件,但在 C 中出现错误 double free 或 corruption

gcc - 编译 FFTW 时出现问题