2012-03-03 21 views
1

文法上の質問ですが、ここに私のコードスニペットがあります。 (申し訳ありませんが、ブラウザは、私は、スタックオーバーフローの中に適切に貼り付けるせていません。)文字列リテラルを関数に渡して 'char *'を受け取り、コンパイラの警告を受け取る

#include <iostream>  /* 'iostream.h' is deprecated. */ 
#include <cstring> 
#include <cstdlib> 
#include <cstdio> 

using namespace std; /* Required. */ 

FILE *OpenFile(char *Filename) 
{ 
     FILE *FP; 

     if((FP = fopen(Filename, "r")) == NULL) 
     {  /* Error opening file. */ 
       std::cout << "[!!] Unable to open database!" 
          << " Are you sure it exists?\n" 
          << "[<<] Database Unchanged.\n"; 
       exit(EXIT_FAILURE);  /* End program. */ 
     } 

     else /* Properly opened the file. */ 
       return FP; 
} 

int main(void) 
{ 
     FILE *Data;  /* Our database file pointer. */ 
     Data = OpenFile("Data.txt"); 
     printf("Success!\n"); 
     return 0; 
} 

私はコンパイルするとき、私は次の警告を得る:私は間違っているつもりです

$ g++ test.cpp -o test 
test.cpp: In function ‘int main()’: 
test.cpp:27:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 
$ 

を? C++で

+1

ここにコードを貼り付けてください。私たちがあなたのコードを見るために外部サイトにアクセスするようにしないでください。 –

+0

私は知っている、Firefoxは私のために奇妙な動作している理由を把握しようとしています。 –

+0

'cerr'のエラーを報告します。それがそのために設計されたものです。理論的には、 'FILE * Data = OpenFile(" data.txt ");'を使い、終了する前にファイルを閉じるのは良い考えです。実際には、この点ではそれほど重要ではありませんが、多くの場合、割り当てられたリソースを解放しないことは悪い考えであり、RAII(Resource Acquisition Is Initialization)は定義表記の初期化を提案します。 –

答えて

11

文字列リテラルは、(Nが終端NULを含む文字列内の文字の数である)「Nconst charのアレイ」タイプのものです。

FILE *OpenFile(const char *Filename)