【问题标题】:Create function with a duplicate name创建具有重复名称的函数
【发布时间】:2020-03-22 02:06:25
【问题描述】:

我的任务是使用 Pipes 创建一个 popen() 函数,我已经完成了。问题是该函数还必须命名为 popen,而不是 mypopen 或 popen2 等。

我正在寻找一个人来指导我如何实现这一目标。

目前我有一个头文件 popen.h 和另一个我创建的文件 popen.c。

popen.h 有

void popen(char *arr[]);

虽然 popen.c 有实际的 popen 函数代码(有效,只是在函数名称为 popen 时无效)。

目前,当我的函数被调用 popen 时,我在编译时遇到了先前的声明错误。

如何让编译器在我的和 stdio.h 版本这两个不同的 popen 函数之间进行选择。

【问题讨论】:

  • 名字一样,那参数呢?它们也一样吗?
  • 不,两个popens之间的参数不一样
  • 如果你用 C++ 编码,你可以重载函数名;如果你用 C 编码,你不能。您可能应该使用与(POSIX)标准popen() 相同的接口编写popen()(并且也编写pclose())。然后,您可能可以不用使用您的代码而不是系统提供的代码。标准(C 和 POSIX)不保证你会(并暗示你不会),但你可能会。
  • 如果您不符合标准接口,您将无法在代码中使用标准标头(例如<stdio.h>)——这让您的生活变得极其复杂。如果接口不同,请使用不同的名称。如果你不这样做,你会迷惑所有人。
  • 据我所知,这个功能叫做重载,我找到了this。希望对您有所帮助。

标签: c linker


【解决方案1】:

在声明、定义和使用你的函数之前只是#define popen my_popen,但在包含<stdio.h>之后。

popen.h

#define popen   my_popen
void popen(char *arr[]);

popen.c

#include <stdio.h>
#include "popen.h"
void popen(char *arr[]){ printf("that's NOT the stdio's popen\n"); }

ma​​in.c

#include <stdio.h>
#include "popen.h"
int main(void){
        popen(0); printf("done\n");
}

同样,如果您真的想要一个名为@987654330 的符号,您可以通过在包含&lt;stdio.h&gt; 之前将popen 定义为stdio_popen 并在之后取消定义来隐藏stdio 的popen @:

#define popen   stdio_popen
#include <stdio.h>
#undef popen

void popen(char *arr[]){ printf("that's NOT the stdio's popen\n"); }

int main(void){
        popen(0); printf("done\n");
}
$ nm a.out | grep popen
0000000000001160 T popen

这种讨厌的技巧只有在必须组合污染彼此命名空间的讨厌的源代码时才有用。将您刚刚编写的函数命名为 popen() 而不是其他名称的理由为零,除非它是一个直接替换,具有与标准函数相同的接口。

【讨论】:

  • 这完全有效,而且是有用的信息,因为我不知道你能做到这一点(仍在大学学习 comp sci)。我将我的 popen 更改为与 stdio.h 版本的 popen 具有相同的参数,之后它运行良好,只需要我更改一些驱动程序。
  • 第二个建议可能会产生链接问题,因为本地 popen 符号将与系统库中的某些外部符号同名。这可以管理,但确实很脏。
【解决方案2】:

如果你想安全地使用popen,你还必须确保你没有使用&lt;stdio.h&gt;,因为这是普通popen所在的位置,如果有两个名为popen的相同符号,你的链接器将不喜欢它。

【讨论】:

  • 我不太清楚你所说的''是什么意思
  • 抱歉,刚才在手机上输入了撇号错误
猜你喜欢
  • 2013-01-19
  • 2013-07-23
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多