相关疑难解决方法(0)

不同C++文件中的相同类名

如果两个C++文件具有相同名称的类的不同定义,那么当它们被编译和链接时,即使没有警告也会抛出某些内容.例如,

// a.cc
class Student {
public:
    std::string foo() { return "A"; }
};
void foo_a()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当使用g ++编译和链接在一起时,两者都将输出"A"(如果a.cc在命令行顺序中位于b.cc之前).

这里有类似的话题.我看到命名空间将解决这个问题,但我不知道为什么链接器甚至不会发出警告.如果该类的一个定义具有未在另一个中定义的额外函数,则说b.cc更新为:

// b.cc
class Student {
public:
    std::string foo() { return "B"; }
    std::string bar() { return "K"; }
};
void foo_b()
{
    Student stu;
    std::cout << stu.foo() …
Run Code Online (Sandbox Code Playgroud)

c++ class name-clash

22
推荐指数
1
解决办法
8642
查看次数

如何捕捉无意识的功能插入?

通过我的书" 专家C编程",我看到了关于功能插入的章节,以及如果无意中发生了如何导致一些严重的难以发现的错误.

书中给出的例子如下:

my_source.c

mktemp() { ... }

main() {
  mktemp();
  getwd();
}
Run Code Online (Sandbox Code Playgroud)

的libc

mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
Run Code Online (Sandbox Code Playgroud)

根据这本书,发生的事情main()mktemp()(标准C库函数)被my_source.c中的实现插入.虽然main()调用我的实现mktemp()是预期的行为,但是getwd()(另一个C库函数)调用我的实现mktemp()不是.

显然,这个例子是SunOS 4.0.3版本中存在的真实生活中的错误lpr.该书接着解释修复是将关键字添加static到定义mktemp()my_source.c ; 虽然改名完全应该也解决了这个问题.

本章给我留下了一些未解决的问题,希望你们能回答:

  1. GCC是否有办法警告功能干预?我们当然不会打算发生这种情况,如果有的话,我想知道它.
  2. 我们的软件组是否应该采用将关键字static放在我们不希望暴露的所有功能之前的做法?
  3. 可以用静态库引入的函数进行插入吗?

谢谢您的帮助.

编辑

我应该注意到,我的问题不仅仅是针对插入标准C库函数,还包括其他库中的函数,可能是第三方,也许是内部创建的.本质上,我想捕捉任何插入的实例,无论插入的函数在哪里.

c linker gcc function-interposition

6
推荐指数
1
解决办法
1065
查看次数

从同一编译单元覆盖C中的函数调用

我试图在C中覆盖一个函数调用,但是当在同一个编译单元中使用该函数时,我遇到了问题.在下面的代码中,我试图替换函数get_resolution(),但我只能在test.c中完成但不能从display.c中实现它.

// display.c -------------------------------------------------------------

#include <stdio.h>

void get_resolution()
{
    printf("Original get_resolution\n");
}

void display()
{
    get_resolution();
}

// test.c ----------------------------------------------------------------

#include <stdio.h>

void __wrap_get_resolution()
{
    printf("Mock get_resolution\n");
    // __real_get_resolution(); // Should be possible to call original
}

int main()
{
    display();         // **ISSUE** Original get_resolution() is called
    get_resolution();  // __wrap_get_resolution() is called
    return 0;
}

// gcc -Wl,--wrap,get_resolution display.c test.c
Run Code Online (Sandbox Code Playgroud)

我的要求是,当我从main()调用display()时,我希望执行__wrap_get_resolution(),但我总是看到正在调用原始的get_resolution().对拆卸的一点分析表明函数get_resolution被不同地调用:

在display() - > get_resolution()的地址已经解析

00000000 <_get_resolution>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 …
Run Code Online (Sandbox Code Playgroud)

c linker gcc overriding function

6
推荐指数
2
解决办法
4388
查看次数