-1

非常具体的 C++ 编译语法错误,我无法找到解决方案:我对 C++ 相当陌生,并且阅读了作为参数传递的函数。编译错误对我来说没有意义,因为我一遍又一遍地阅读了代码。请帮忙。

编辑:我删除了 waitpid(pid_t,int,int) 并坚持使用 system() 命令。感谢大家的帮助。

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(){
/* puts apt-get purge text into ~$ purge_e_output */
    system("sudo apt-get purge enlightenment > purge_e_output.txt");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}
    system("echo **REMOVING ENGLIGHTENMENT**"); 
    system("sudo apt-get purge enlightenment");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}

/* puts apt-get autoremove text into ~$ autoremove_e_output */
    system("sudo apt-get autoremove > autoremove_e_output.txt");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}

    system("echo **REMOVING E DATA**"); 
    system("sudo apt-get autoremove");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}

/* puts apt-get autoclean text into ~$ autoclean_e_output */
    system("sudo apt-get autoclean > autoclean_e_output.txt");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}
    system("echo **CLEANING**");    
    system("sudo apt-get autoclean");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}

/* reinstall englightenment */
    system("echo **REINSTALLING**");    
    system("sudo apt-get install enlightenment");
    system("echo **Pid of apt-get**");
    system("pidof apt-get");
    try{
        pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
    } catch(...){}

/* logs */
    system("echo && echo Logs for wtf just happened:");
    system("echo && echo ~$ purge_e_output.txt && echo ~$ autoremove_e_output.txt && echo ~$ autoclean_e_output.txt");

}

编译错误:

~$ g++ JIC.cpp -o JIC

JIC.cpp: In function ‘int main()’:
JIC.cpp:12: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:18: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:26: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:34: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:42: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:49: error: expected ‘,’ or ‘...’ before ‘(’ token
JIC.cpp:58: error: expected ‘,’ or ‘...’ before ‘(’ token
4

3 回答 3

2

这在那个地方没有意义:

pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);
于 2012-07-08T00:06:54.703 回答
1

你不能做这个

    pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);

相反,您需要实际创建要传递给此函数的变量的实例。例如

    pid_t pid = getpid();
    int status = // set to some value that you choose

然后你可以像这样调用你的函数

    pid_t pid2 = waitpid(pid, &status, WUNTRACED);

nowpid2是函数返回的值waitpid。我强烈建议您多阅读一些书籍 - 无论是书籍还是教程 - 因为您的问题表明您还没有很好地掌握这门语言。我的意思是完全没有冒犯的意思——只是想帮忙。

于 2012-07-08T00:06:49.453 回答
1

线

pid_t waitpid(pid_t getpid("apt-get"), int *statusPtr, int WUNTRACED);

对我和 C++ 编译器来说,看起来都像是一个函数声明。看起来您正试图声明一个名为的函数waitpid,其返回类型为pid_t,它接受三个参数 a pid_t、 anint*和 an int。但是,参数的名称不能是getpid("apt-get"),因此除了这是文件中函数声明的错误位置之外,您不能将其解释为函数声明,因为它试图将函数调用用作范围。

相反,如果您尝试将此行解释为对名为waitpid(已定义)的函数的函数调用,getpid("apt-get")则作为参数是有意义的,因为这意味着您要将getpid函数的结果作为第一个参数传递给waitpid函数。但是,该行的其余部分对于函数调用来说是不正确的语法,因为不应内联指定函数调用的参数类型 - 您应该传递已经定义为变量或函数的参数。对函数的语法正确调用waitpid可能如下所示:

int* statusPtr = ...;
int WUNTRACED = ...;
pid_t myPid = waitpid(getpid("apt-get"), &statusPtr, WUNTRACED);

以下定义可能出现在其他地方:

pid_t waitpid(pid_t pid, int *statusPtr, int WUNTRACED) {
    ...
}
于 2012-07-08T00:20:28.433 回答