首页 > 解决方案 > 创建具有重复名称的函数

问题描述

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

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

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

popen.h 刚刚有

void popen(char *arr[]);

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

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

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

标签: clinker

解决方案


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

弹出.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"); }

主程序

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

同样,如果您真的想要一个名为的符号,您可以通过在包含之前定义和之后取消popen定义popen来隐藏标准输入输出:stdio_popen<stdio.h>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()命名您刚刚编写的函数而不是其他名称的理由为零,除非它是一个插入式替换,具有与标准函数相同的接口。


推荐阅读