c - 当在同一文件中定义其调用函数时如何在 C 中模拟函数?

标签 c linux c++11 gcc cmocka

我正在尝试在 C 中模拟一个函数,当函数及其调用函数定义在不同的文件中时,模拟工作正常。但是当两个函数(函数本身和它的调用者)在同一个文件中定义时,模拟函数不会被调用。


案例一:

//test.c

#include <stdio.h>

/*mocked function*/
int __wrap_func() {
   printf("Mock function !!!\n"); 
}

/*caller function*/
int myTest() {
  return func();
}

int main() {
    myTest();
    return 0;
}

//file.c
#include<stdio.h>

/*function need to be mocked*/
int func() {
  printf("Original function !!!\n");
    }

案例 2:

//test.c
#include <stdio.h>
extern int myTest();
/*mocked function*/
int __wrap_func() {
  printf("Mock function !!!\n");
}

int main() {
    myTest();
}
//file.c
#include<stdio.h>

/*function need to be mocked*/
int func() {
  printf("Original function !!!\n");
}

/*caller function*/
int myTest() {
  return func();
}

代码编译命令:gcc -Wl,--wrap=func test.c file.c

In Case 1 . Mock function !!!
In Case 2 . Original function !!!

在情况 2 中,模拟函数未被调用。我正在寻找一种解决方案,即使调用者和被调用函数在同一个文件中,我也可以模拟函数。

最佳答案

使用以两个下划线开头的函数名在 C 语言中是未定义的行为

(在你的情况下,我怀疑函数名称 __wrap_funcfuncdecorated 名称冲突,但这是推测性的,完全是编译器-依赖。)

您应该考虑使用函数指针 的解决方案。

关于c - 当在同一文件中定义其调用函数时如何在 C 中模拟函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31156327/

相关文章:

c - 在 C 中调试 Valgrind

c - gcc,内联汇编 - pushad/popad 丢失?

c - 解释以下C程序的输出

linux - 时间差在Linux中使用mktime函数

c++ - 如何为枚举编写只影响特定枚举类型的通用函数?

c++ - TBB 分配发出终止信号

c - 数字列表框

java - 如何在 Linux 上安装 java 应用程序包

linux - 内核模块从用户空间获取数据

sockets - C++ - 如何从 struct sockaddr 获取 IP 和端口