我写了一个小测试程序,在编译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);
为什么我在想? 两个源文件中的包含相同
答案 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
正确的头文件。 popen
和pclose
位于<stdio.h>
,但您需要确保在任何#include
之前定义正确的feature test macro。 (例如,#define _XOPEN_SOURCE 700
将起作用。)