请不要告诉我用__FILE__和__LINE__宏,他们只能得到自己所在的文件名和行号,无法得到调用方的文件名和行号。
比如:
file1.c
void my_fun()
{
/*打印file2.c的文件名和行号(这里应该为5)*/
}
file2.c
extern void my_fun();
int main()
{
my_fun();
return 0;
}
谢谢!!!
16 个解决方案
#1
做不到。要不然你再做一件错误的事情,要不然你在用错误的方式。
#2
#include <stdio.h>
void fun(int a)
{
printf("%d\n", a);
}
int main()
{
fun(__LINE__);
return 0;
}
#3
问题解决结贴吧
拿次分真的很难~~
拿次分真的很难~~
#4
// 这样声明
void* fun(char const* file, int line);
// file2.c main函数中调用
fun(__FILE__, __LINE__);
这样在file1.c中的fun函数就得到了调用方的文件名的行号
void* fun(char const* file, int line);
// file2.c main函数中调用
fun(__FILE__, __LINE__);
这样在file1.c中的fun函数就得到了调用方的文件名的行号
#5
不好意思,不能修改参数表。是这样的,我想用我自己的my_malloc函数代替malloc函数来实现对程序动态内存使用的跟踪,而这种替换又必须是自动的,不能让程序员察觉,所以我通过使用
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。
#6
如果不能做到,那像valgrind这样的内存跟踪工具是怎样做到的呢?
#7
linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?
像win32有StackWalk64函数,linux应该有类似的吧?
#8
看错了lz需求,请无视吧。
#9
大虾们帮帮忙啊。。。
#10
#define m_fun(args) fun(__FILE__,__LINE__, args)
#11
不定参数能用吗?
类似于这样的?
int test(char *str, int flag, ...);
类似于这样的?
int test(char *str, int flag, ...);
#12
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?
#13
我也想知道,求教~
#14
可以详细点吗 我还是看不懂 我也需要这个问题的答案了
#15
可以写个小程序么 给我看看么 我有点不懂
#16
能解释一下这个函数的用法吗?
#1
做不到。要不然你再做一件错误的事情,要不然你在用错误的方式。
#2
#include <stdio.h>
void fun(int a)
{
printf("%d\n", a);
}
int main()
{
fun(__LINE__);
return 0;
}
#3
问题解决结贴吧
拿次分真的很难~~
拿次分真的很难~~
#4
// 这样声明
void* fun(char const* file, int line);
// file2.c main函数中调用
fun(__FILE__, __LINE__);
这样在file1.c中的fun函数就得到了调用方的文件名的行号
void* fun(char const* file, int line);
// file2.c main函数中调用
fun(__FILE__, __LINE__);
这样在file1.c中的fun函数就得到了调用方的文件名的行号
#5
不好意思,不能修改参数表。是这样的,我想用我自己的my_malloc函数代替malloc函数来实现对程序动态内存使用的跟踪,而这种替换又必须是自动的,不能让程序员察觉,所以我通过使用
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。
#define malloc my_malloc
这样的方式来替换名字,参数表要和malloc一模一样,也就意味着参数表不能更改。
#6
如果不能做到,那像valgrind这样的内存跟踪工具是怎样做到的呢?
#7
linux下应该有打印函数调用堆栈的函数吧?
像win32有StackWalk64函数,linux应该有类似的吧?
像win32有StackWalk64函数,linux应该有类似的吧?
#8
看错了lz需求,请无视吧。
#9
大虾们帮帮忙啊。。。
#10
#define m_fun(args) fun(__FILE__,__LINE__, args)
#11
不定参数能用吗?
类似于这样的?
int test(char *str, int flag, ...);
类似于这样的?
int test(char *str, int flag, ...);
#12
谢谢“南宫笨耗子”,用你的方法实现了。我想多问一句,为什么预编译的时候没有把#define m_fun(args) fun(__FILE__,__LINE__, args)这句宏定义里面的__FILE__和__NAME__宏替换掉呢,而是到了m_fun函数那里才替换。这种嵌套的宏定义有什么要注意的吗?
#13
我也想知道,求教~
#14
可以详细点吗 我还是看不懂 我也需要这个问题的答案了
#15
可以写个小程序么 给我看看么 我有点不懂
#16
能解释一下这个函数的用法吗?