0

非常に長いメッセージを処理するソケット システムを作成しようとしています (チャット システムを処理します)。const int を使用して配列を初期化しようとしていますが、これはコンパイルされますが、ISO C++ が禁止しているという警告が表示されます。誰かが状況に光を当てることができますか?

これがどのように使用されるかの例です(これは、バイトが残っているマルチ受信システムを書くことを避けるためです(私はすでに持っていますが、これはより効率的だと思います))。

    const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call
       if(BUFFERLEN != -1) { //it returns "-1" on error
          char INBUFFER[BUFFERLEN];
          recv(SOCK,INBUFFER,sizeof(INBUFFER),0);
       }

これはまったく受け入れられますか、それとも複数の受信が完了するまでの方法に固執する必要がありますか?

ありがとう、コリン

4

4 に答える 4

5
 const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call
       if(BUFFERLEN != -1) { //it returns "-1" on error
          std::vector<char> INBUFFER(BUFFERLEN);
          recv(SOCK,INBUFFER.data(),INBUFFER.size(),0);
       }
于 2012-06-12T07:39:43.670 に答える
2

C++ 配列を使用する場合、コンパイル時にサイズがわかっている必要があります。それ以外の場合は、動的割り当てを使用する必要があります。const必ずしもそれBUFFERLENがコンパイル時定数であることを意味するわけではありません。

于 2012-06-12T07:40:20.350 に答える
1

const int を使用して配列を初期化しようとしていますが、これはコンパイルされますが、ISO C++ が禁止しているという警告が表示されます。誰かが状況に光を当てることができますか?

これはconst int、プログラム内の が実際には定数式 (コンパイル時に既知の値) ではないためです。これは、プログラム内で宣言された配列が、ISO C++ では許可されていない可変長配列 (VLA) であることを意味します。コンパイラが拡張機能として VLA を提供するため、プログラムはコンパイルされます。

使用できるものは と呼ばれstd::vector<char>ます。

その代わりに、

char INBUFFER[BUFFERLEN];  //old code

あなたが使用することができます

std::vector<char> INBUFFER(BUFFERLEN); //new code

代わりに、

recv(SOCK,INBUFFER,sizeof(INBUFFER),0); //old code

あなたは書ける:

recv(SOCK, &INBUFFER[0], INBUFFER.size(),0); //new code
于 2012-06-12T07:41:32.760 に答える