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

标签 c gcc

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

当调用SDK函数时,如果发生错误,SDK函数本身会调用错误处理函数。

因此,我想知道是否有办法从调用该函数的用户源代码中了解行号。

示例:

用户.c:

main{ CallSDKFunction(); }

SDK.a文件:

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

... ... ...

void CallERRORHandler( void ){ // Here I want to know in which line in user.c the CallSDKFunction was called}

最佳答案

一种方法是将 __FILE____LINE__ 传递给 SDK 函数,然后让 SDK 函数将它们传递给错误处理函数。但是,用户不想为此烦恼,因此您需要在 SDK 的头文件中定义一个隐藏详细信息的宏。宏看起来像这样

#define CallSDKFunction(a,b) actualSDKFunction( __FILE__, __LINE__, a, b )

用户将使用如下代码调用 SDK。请注意,用户不需要知道 __FILE____LINE__ 正在传递给 SDK 函数。宏会处理这个问题。

int main( void )
{
    int a = 3;
    int b = 4;
    int result = CallSDKFunction( a, b );  
    printf( "%d\n", result );
}

SDK 实现会是这样的

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 );
}

关于C 从 2 个函数调用中获取函数行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932309/

相关文章:

c - 为什么我的程序不能使用 float 变量,但可以使用 int 变量?

c# - 像在 C 中一样在 C# 中使用 struct - 可以吗?

c++ - 如何在宏中使用 vsprintf/vsnprintf?

c - 如何让gcc只生成可以直接加载到内存中执行的机器码?

c - 使用 C 宏进行结构打包

linux - 如何使用 --disable-multilib 构建 gcc 交叉编译器

c++ - 在 Windows 8 上使用 MinGW 在 cmd 中编译 C++

c - 宏内部工作

c - 复制名称中包含双引号的文件时,Mac OS 10.7.5 BSD copyfile() EINVAL

c - 在 c 中调试日志文件