-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戻り値の型がであるという名前の関数を宣言しようとしているようです。この関数は、 a 、 an 、および anpid_tの 3 つのパラメーターを受け取ります。ただし、パラメーターの名前を にすることはできないため、これは関数宣言のファイル内の間違った場所であることに加えて、関数呼び出しを関数の名前として使用しようとするため、これを関数宣言として解釈することはできません。パラメータ。pid_tint*intgetpid("apt-get")

waitpid逆に、この行を(既に定義されている)という名前の関数への関数呼び出しとして解釈しようとすると、関数の結果を最初のパラメーターとして関数getpid("apt-get")に渡す必要があるため、パラメーターとして意味があります。ただし、関数呼び出しのパラメーターの型をインラインで指定しないでください。変数または関数として既に定義されているパラメーターを渡す必要があるため、残りの行は関数呼び出しの構文として正しくありません。関数の構文的に正しい呼び出しは次のようになります。getpidwaitpidwaitpid

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 に答える