2017-11-28 24 views
-1

この問題はMacOS上にのみ存在するようですが、clangを使用してもlinuxでコンパイルできます。MacOSでClangのコンパイルエラー

clang++ -std=c++11 main.cpp -o test 

:これらは、使用しているコンパイラの引数た

main.cpp:2:5: error: redefinition of 'index' as different kind of symbol 
int index = 0; 
    ^
/usr/include/strings.h:73:7: note: previous definition is here 
char *index(const char *, int) __POSIX_C_DEPRECATED(200112L); 
     ^
main.cpp:5:18: warning: address of function 'index' will always evaluate to 
     'true' [-Wpointer-bool-conversion] 
    std::cout << index << std::endl; 
       ~~ ^~~~~ 
main.cpp:5:18: note: prefix with the address-of operator to silence this warning 
    std::cout << index << std::endl; 
       ^
       & 
1 warning and 1 error generated. 

次のコードは、

#include<iostream> 
int index = 0; 
int main() 
{ 
    std::cout << index << std::endl; 
} 

は、コンパイルでこのエラーをスローし、簡素化されますが、問題を示していますstdioでiostreamを削除するか、コードが期待通りにコンパイルされません。彼らはこれを修正する方法ですか、あるいはこれを避けるために変数の名前を変更する必要がありますか?

私はthisを見つけましたが、すでにC++ 11フラグを使用していますが、-std = c11フラグはC++コードでは有効ではないようです。

+1

なぜそれをコンパイルすると思いますか? – juanchopanza

+0

'index'とは何だと思いますか? –

+1

あなたは明らかにコードを再入力しています - そうしないでください - コピー&ペーストを使って投稿してください。 –

答えて

1

<iostream>を含めると、使用しているclang/xcodeの特定のバージョンに<strings.h>ヘッダーが含まれることがあります。 <strings.h>は、グローバルスコープでindex()と呼ばれる機能を提供します。したがって、同じ名前のグローバルスコープでも変数を宣言することはできません。

いずれかの変数の名前を変更、またはmain()に移動:

#include <iostream> 

int main() 
{ 
    int index = 0; 
    std::cout << index << std::endl; 
} 

変数は何か他のものと同じ識別子を持っていますが、別のスコープ内にあるとき、それは全く別の実体と考えられているので、これは動作します。

#include <iostream> 

int myVar = 0; 

int main() 
{ 
    int myVar = 1; 
    std::cout << myVar << '\n'; 
    std::cout << ::myVar << '\n'; 
} 

はこれを印刷します:

1 
0 

myVarは、ローカル変数を参照するため、しかし、1つの::myVar

はあなたに動作する、このコードを検討する方法の例を与えるために、グローバルスコープ。

+0

strings.hを含まないバージョンまたはXcode/clangはありますか?検索結果から、Macのデフォルトヘッダーのように思えます。私は現在Apple LLVMバージョン9.0.0(clang-900.0.38)を使用しています。 –

+0

@ErikWいいえ。いずれにせよ、あなたがコントロールできるものではありません。したがって、別の名前を使用するか、別のスコープに変数を移動するか、別の答えでCalebが指摘する名前空間を使用してください。 –

0

これを修正する方法はありますか、これを避けるために変数の名前を変更する必要がありますか?

C++は、名前間の衝突を避けるための特別な名前空間を提供します。変数に1つを作成することができます:

#include<iostream> 

namespace MyGlobals { 
    int index = 0; 
} 

int main() 
{ 
    std::cout << MyGlobals::index << std::endl; 
} 
関連する問題