【发布时间】:2017-10-01 21:57:58
【问题描述】:
我写了一个小测试程序,当使用 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: %s\n",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;
}
现在我想在我正在处理的 Qt C++ 程序中使用这个相同的函数,所以我将该函数复制到我的类中的私有方法中:
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: %s\n",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;
}
标题中的声明:
private:
int Ping(char *host);
但是现在,它没有编译,编译器抱怨:
error: too many arguments to function 'FILE* popen()'
if(!(in = popen(cmd, "r"))){
^
为什么我想知道这个? 两个源文件中的包含相同
【问题讨论】:
-
如果你摆脱
extern FILE *popen();会发生什么? -
在 C++ 中,您的前向声明必须是完整的。
extern FILE *popen();声明popen接受 0 个参数,然后你用 2 调用它。这将被拒绝。要么包含正确的标题,要么正确地声明它 -
@MikeVine 谢谢,如果您将此评论移到答案中,我会接受它作为解决方案!
-
包括相关的头文件,不要自己重新声明库函数。