在C ++中使用'FILE * popen()'函数的参数太多了

时间:2017-10-01 21:57:58

标签: c++ gcc popen

我写了一个小测试程序,在编译GCC时按预期编译和运行:

<div id="div">
  <form action="" id="priceForm">
    <label class="dishes"><input type="checkbox" id="dish1" value="number1"> Dish Name 1</label><br>
    <label class="labelQuantPeople">Number of Dishes</label><br>
    <select id="quantityDish1" name='numberPeoplel1' onchange="calculateTotal()">
      <option class="quantDish1" value="0">0</option>
      <option class="quantDish1" value="1">1</option>
      <option class="quantDish1" value="2">2</option>
      <option class="quantDish1" value="3">3</option>
      <option class="quantDish1" value="4">4</option>
      <option class="quantDish1" value="5">5</option>
      <option class="quantDish1" value="6">6</option>
      <option class="quantDish1" value="7">7</option>
      <option class="quantDish1" value="8">8</option>
      <option class="quantDish1" value="9">9</option>
      <option class="quantDish1" value="10">10</option>
    </select><br>
    <label class="dishes"><input type="checkbox" id="dish2" value="number2"> Dish Name 2</label><br>
    <label class="labelQuantPeople">Number of Dishes</label><br>
    <select id="quantityDish2" name='numberPeoplel2' onchange="calculateTotal()">
      <option class="quantDish2" value="1">1</option>
      <option class="quantDish2" value="2">2</option>
      <option class="quantDish2" value="3">3</option>
      <option class="quantDish2" value="4">4</option>
      <option class="quantDish2" value="5">5</option>
      <option class="quantDish2" value="6">6</option>
      <option class="quantDish2" value="7">7</option>
      <option class="quantDish2" value="8">8</option>
      <option class="quantDish2" value="9">9</option>
      <option class="quantDish2" value="10">10</option>
    </select><br>
  </form>
</div>
<p id="totalPrice"></p>

现在我想在我正在使用的Qt C ++程序中使用相同的函数,所以我将该函数复制到我班级的私有方法中:

#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;
}
标题中的

声明:

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);

为什么我在想? 两个源文件中的包含相同

1 个答案:

答案 0 :(得分:2)

在C中,您可以使用空参数列表声明函数而不声明任何特定原型。 (你不应该这样做。它已经被弃用了很长时间。但你可以。)如果你想声明一个不带参数的函数,你需要使用void作为参数列表。

这在C ++中不起作用。在C ++中,空参数列表表示该函数不带参数。

所以在C中,

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

在C ++中

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

而不是自己声明popen(和其他库函数),#include正确的头文件。 popenpclose位于<stdio.h>,但您需要确保在任何#include之前定义正确的feature test macro。 (例如,#define _XOPEN_SOURCE 700将起作用。)