这是从头开始模拟纯 C 函数的有效方法吗?

问题描述 投票:0回答:1
// fakePow.c
#include <math.h>
double pow(double b, double p)
{ 
    return 6.0;
}
//main.c
#include <stdio.h>
#include <math.h>
int twice(int x)
{
    if (x <= 0)
        return 0;

    return x * 2;
}
int main()
{
    int x = pow(10, 2);
    int res = twice(x);
    printf("%d\n", res);
    return 0;
}

首先,我尝试了简单的编译,它不起作用,它返回200而不是12

gcc -c main.c
gcc -c fakePow.c
gcc main.o fakePow.o -o main
./main

200

然后我用google找到了LD_PRELOAD,但它也不起作用,因为它返回200而不是12

gcc -c main.c
gcc -shared -o ./fakePow.so ./fakePow.c
LD_PRELOAD=./fakePow.so ./main

200
c mocking linker
1个回答
0
投票

这是从头开始模拟纯 C 函数的有效方法吗?

不。 C 编译器可能具有标准库例程的内置知识,并且您的编译器在编译期间使用该知识来评估

pow(10, 2)
,无论您为函数提供什么定义。这是 C 标准允许的,因为标准库例程的名称是保留的,这意味着如果程序尝试将它们用于任何其他目的,则不会定义行为。

您的编译器可能有一个开关来关闭标准库例程的知识。使用 Clang 和 GCC,您可以使用

-fno-builtin-function
禁用将
function
视为已知函数,或使用
-fno-builtin
禁用所有内置函数的知识。

© www.soinside.com 2019 - 2024. All rights reserved.