/ / príliš veľa argumentov pre funkciu 'FILE * popen ()' v C ++ - c ++, gcc, popen

príliš veľa argumentov pre funkciu 'FILE * popen ()' v C ++ - c ++, gcc, popen

Napísal som malý testovací program, ktorý kompiluje a beží podľa očakávania pri kompilácii s GCC:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSZ 512

int ping_test(char *host);

int main(void) {
if (ping_test("192.168.1.1"))
printf("PING OK!n");
else
printf("PING FAIL!n");



}

// returns 1 if ping succeeds, 0 otherwise
int ping_test(char *host)
{
FILE *in;
int i = 0;
int ok = 1;
extern FILE *popen();
char buff[BUFFSZ] = {0};
char res[BUFFSZ] = {0};
char cmd[50]={0};

sprintf(cmd,"ping -c 1 %s",host);
if(!(in = popen(cmd, "r"))){
exit(1);
}
while(fgets(buff, sizeof(buff), in)!=NULL){
strcat(res,buff);
}
pclose(in);
printf("RESULT: %sn",res);
// check for string "100%"
for (i=0;i<BUFFSZ;i++) {
if (res[i] == "%" &&
res[i-1] =="0" &&
res[i-2] =="0" &&
res[i-3] =="1"){
ok = 0;
return ok;
} else
ok = 1;
}
return ok;
}

teraz chcem používať túto funkciu v Qt C ++ programe, na ktorom pracujem, takže som túto funkciu skopíroval do súkromnej metódy v mojej triede:

int JTFTestSuite::Ping(char *host)
{
FILE *in;
int i = 0;
int ok = 1;
extern FILE *popen();
char buff[BUFFSZ] = {0};
char res[BUFFSZ] = {0};
char cmd[BUFFSZ]={0};

sprintf(cmd,"ping -c 1 %s",host);
if(!(in = popen(cmd, "r"))){
exit(1);
}
while(fgets(buff, sizeof(buff), in)!=NULL){
strcat(res,buff);
}
pclose(in);
printf("RESULT: %sn",res);
// check for string "100%"
for (i=0;i<BUFFSZ;i++) {
if (res[i] == "%" &&
res[i-1] =="0" &&
res[i-2] =="0" &&
res[i-3] =="1"){
ok = 0;
return ok;
} else
ok = 1;
}
return ok;
}

vyhlásenie v hlavičke:

private:
int Ping(char *host);

ale teraz to nie je kompilovať, kompilátor sa sťažuje na:

error: too many arguments to function "FILE* popen()"
if(!(in = popen(cmd, "r"))){
^

Prečo je to "ja som premýšľal?" Zahrnuté sú identické v oboch zdrojových súboroch

odpovede:

2 pre odpoveď č. 1

V C, môžete deklarovať funkciu bezdeklarovaním akéhokoľvek konkrétneho prototypu pomocou prázdneho zoznamu parametrov. (Nemali by ste to robiť. Bolo to už dávno odmietané. Ale môžete.) Ak chcete deklarovať funkciu, ktorá nemá žiadne parametre, musíte použiť void ako zoznam parametrov.

Toto nefunguje v C ++. V C ++ znamená prázdny zoznam parametrov, že funkcia nepotrebuje žiadne argumenty.

Takže v jazyku C,

FILE* popen();  // unspecified what the parameters are
FILE* f = popen(cmd, "r");   // called with two strings

V C ++

FILE* popen();  // takes no arguments
FILE* f = popen(cmd, "r");   // illegal because popen takes no argument.

Namiesto vyhlásenia popen (a iné funkcie knižnice) sami, #include správny súbor záhlavia. popen a pclose sú v <stdio.h>, ale musíte sa uistiť, že ste definovali správne makra testovania funkcie pred akýmkoľvek #includes. (#define _XOPEN_SOURCE 700 bude fungovať napríklad.)