C从2个函数调用中获取函数行号

C从2个函数调用中获取函数行号,c,gcc,C,Gcc,在开发小型SDK的过程中,我需要创建一个“错误处理程序”。为了提高效率,我想得到调用函数的行号,我不知道在C中是否可以(使用GCC进行编译) 调用SDK函数时,如果发生错误,SDK函数本身将调用错误处理程序函数 有了这些,我想知道是否有办法从调用函数的用户源代码中知道行号 例如: 用户c: main{ CallSDKFunction(); } SDK.a文件: void CallSDKFunction( void ){ if ( ERROR ){ CallERRORHandler(); } }

在开发小型SDK的过程中,我需要创建一个“错误处理程序”。为了提高效率,我想得到调用函数的行号,我不知道在C中是否可以(使用GCC进行编译)

调用SDK函数时,如果发生错误,SDK函数本身将调用错误处理程序函数

有了这些,我想知道是否有办法从调用函数的用户源代码中知道行号

例如:

用户c:

main{ CallSDKFunction(); }
SDK.a文件:

void CallSDKFunction( void ){ if ( ERROR ){ CallERRORHandler(); } }
。。。 ...


如果我正确理解了您的要求,您可以使用
\uuuu FILE\uuuu
\uuu LINE\uuuu
宏获取任何指令的文件名和行号。这两个是标准的预定义宏。你可以查一下

此外,还有(
C99
)提供当前函数名

因此,您可以根据需要定义另一个函数原型(可能处于
调试
模式),它在进行函数调用时传递(并接受)额外的参数,如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuu。然后,您可以从被调用函数中显示调用者函数名和行


或者,您也可以查看函数。但是,它是一个GNU扩展。

C预处理器具有特殊的标记
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

要使其工作,必须声明包装宏:

void error(int line, const char *file)
{
    fprintf(stderr, "Error in %s, line %d\n", file, line);
    // handle error
}

#define ERROR() error(__LINE__, __FILE__)

这将把有关宏调用位置的信息传递给错误处理程序。

一种方法是将
\uuuuu文件和
\uuuuuuu行
传递给SDK函数,然后让SDK函数将它们传递给错误处理程序函数。但是,用户不想为此烦恼,因此需要在SDK的头文件中定义一个宏来隐藏细节。宏将如下所示

#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )
int actualSDKFunction( const char *fileStr, int lineNum, int a, int b )
{
    if ( a+b > 5 )
        CallERRORHandler( fileStr, lineNum );
    return( a+b );
}

void CallERRORHandler( const char *fileStr, int lineNum )
{
    printf( "Bad values in file %s at line %d\n", fileStr, lineNum );
}
用户将使用如下代码调用SDK。请注意,用户不需要知道
\uuuuuu文件和
\uuuuu行
正在传递给SDK函数。宏处理这个问题

int main( void )
{
    int a = 3;
    int b = 4;
    int result = CallSDKFunction( a, b );  
    printf( "%d\n", result );
}
SDK的实现是这样的

#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )
int actualSDKFunction( const char *fileStr, int lineNum, int a, int b )
{
    if ( a+b > 5 )
        CallERRORHandler( fileStr, lineNum );
    return( a+b );
}

void CallERRORHandler( const char *fileStr, int lineNum )
{
    printf( "Bad values in file %s at line %d\n", fileStr, lineNum );
}

哇!多谢各位。根据我的理解(我是法国人,所以我的英语不是完美的:p),这正是我需要的。是的,我知道:)我找到了如何修改原始问题,删除了不好的问题,并添加了缺少的问题;)