Создать функцию с повторяющимся именем - PullRequest
1 голос
/ 22 марта 2020

Мне поручено создать функцию popen() с использованием Pipes, которую я уже выполнил. Уловка в том, что функция должна также называться popen, а не mypopen или popen2 и т. Д. c.

Я ищу кого-то, кто направит меня в правильном направлении относительно того, как я могу достичь sh этого .

В настоящее время у меня есть файл заголовка popen.h и другой файл popen. c, который я создал.

popen.h просто имеет

void popen(char *arr[]);

Хотя popen. c имеет действительный код функции popen (который работает, но не при использовании имени функции popen).

В настоящее время я получаю предыдущую ошибку объявления при компиляции, когда моя функция вызывается popen.

Как я могу позволить компилятору выбирать между двумя разными popen-функциями, моей и stdio.h версии.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Просто #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"); }

main. c

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

Аналогично, вы можете скрыть STDIO 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(), а не что-то другое, если только это не замена с заменой, с тем же интерфейсом, что и у стандартной.

1 голос
/ 22 марта 2020

Если вы хотите обеспечить безопасное открывание, вы также должны убедиться, что вы не используете <stdio.h>, поскольку именно здесь находится обычный всплывающее окно, и вашему компоновщику не понравится, если есть два идентичных символа с именем popen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...