다음 소스는 g++ 4.6.2, g++ 4.8.0, g++ 4.8.1 그리고 Visual Studio 2013 Express 의 cl 로 컴파일됨이 확인되었다.

(g++ 4.5.3 과 Visual Studio 2010 의 cl 로는 range based for 구문 때문에 컴파일되지 않는다.)

 

// Filename: vector_for_loop_01.cpp
//
//      Purpose:  How to use vector types and for loops.
//
// With g++ 4.6 above
// Compile: g++ -std=c++0x -o vector_for_loop_01 vector_for_loop_01.cpp
// Compile: g++ -std=c++11 -o vector_for_loop_01 vector_for_loop_01.cpp
// Execute: ./vector_for_loop_01
//
//   or
//
// With Visual C++ 12
// Compile: cl /EHsc vector_for_loop_01.cpp
// Execute: vector_for_loop_01
//
// See: http://stackoverflow.com/questions/409348/iteration-over-vector-in-c

#include <vector>
#include <iostream>

int main(void) {
    std::vector<int> v = std::vector<int>();
    v.push_back(17);
    v.push_back(12);
    v.push_back(23);
    v.push_back(42);
    for ( auto &i : v ) {
        std::cout << i << std::endl;
    }
    return 0;
}

/*
Output:
17
12
23
42
*/

 

참고로 위의 소스를 Visual C++ 10.0(즉 Visual Studio 2010 의 C++)의 명령줄 컴파일러 cl 로 컴파일하면 다음의 에러메세지가 나온다.

------------------------------------------------------------------------

Microsoft (R) 32비트 C/C++ 최적화 컴파일러 버전 16.00.40219.01(80x86)
Copyright (c) Microsoft Corporation. 모든 권리 보유.

vector_for_loop_01.cpp
vector_for_loop_01.cpp(27) : error C2143: 구문 오류 : ','이(가) ':' 앞에 없습니다.
vector_for_loop_01.cpp(27) : error C2530: 'i' : 참조를 초기화해야 합니다.
vector_for_loop_01.cpp(27) : error C3531: 'i': 형식에 'auto'가 포함된 기호에는이니셜라이저가 있어야 합니다.
vector_for_loop_01.cpp(27) : error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.

------------------------------------------------------------------------

 

또한 위의 소스를 cygwin 의 g++ 4.5.3 으로 컴파일하면 다음의 에러메세지가 나온다.

--------------------------------------------------------

vector_for_loop_01.cpp: In function ‘int main()’:
vector_for_loop_01.cpp:27:19: error: expected initializer before ‘:’ token
vector_for_loop_01.cpp:30:5: error: expected primary-expression before ‘return

vector_for_loop_01.cpp:30:5: error: expected ‘;’ before ‘return’
vector_for_loop_01.cpp:30:5: error: expected primary-expression before ‘return

vector_for_loop_01.cpp:30:5: error: expected ‘)’ before ‘return’
-----------------------------------------------------------------------

 

 

다음 소스는 g++ 4.5.3 및  Visual Studio 2010 의 cl 로도 컴파일되도록 for 반목문을 수정한 것이다.

 

// Filename: vector_for_loop_02.cpp
//
//      Purpose:  How to use vector types and for loops.
//
// With g++ 4.5 above
// Compile: g++ -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp
// Compile: g++ -std=c++11 -o vector_for_loop_02 vector_for_loop_02.cpp
// Execute: ./vector_for_loop_02
//
//   or
//
// With Visual C++ 10
// Compile: cl /EHsc vector_for_loop_02.cpp
// Execute: vector_for_loop_02
//
// See: http://stackoverflow.com/questions/409348/iteration-over-vector-in-c

#include <vector>
#include <iostream>

int main(void) {
    std::vector<int> v = std::vector<int>();
    v.push_back(17);
    v.push_back(12);
    v.push_back(23);
    v.push_back(42);
    // for ( auto &i : v ) {
    //     std::cout << i << std::endl;
    // }
    for ( auto it = v.begin(); it != v.end(); it++ ) {
        std::cout << *it << std::endl;
    }
    return 0;
}

/*
Output:
17
12
23
42
*/

 

[참고] --enable-auto-import 에러가 날 때

위의 소스가 HaskellPlatforem 에 설치된 mingw 의 (버전 4.5.2 인) g++ 로 캄파일할 때 --enable-auto-import 에러가 날 때가 있다.

C:\test\mingw>g++ -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp
Info: resolving std::cout  by linking to __imp___ZSt4cout (auto-import)
d:/haskellplatform/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld
.exe: warning: auto-importing has been activated without --enable-auto-import sp
ecified on the command line.
This should work unless it involves constant data structures referencing symbols
 from auto-imported DLLs.

 

원인은 디헥토리 D:\HaskellPlatform\mingw\lib\gcc\mingw32\4.5.2  에 있는 라이브러리 파일 libstdc++.dll.a 을 찾지 못해 일어나는 에러인 것 같은데 이를 어떻게 해결해냐 하는가?

 

g++ 로 컴파할 때 옵션 --enable-auto-import 를 주고 해보았다.

C:\test\mingw>g++ --enable-auto-import -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp
cc1plus.exe: error: unrecognized command line option "-fenable-auto-import"

옵션이 인식이 안된다, 이러 때는 옵션

               -enable-auto-import   또는  -Wl,--enable-auto-import

르 주면 에러나 경고 없이 컴파일이 잘 된다.

C:\test\mingw>g++ -enable-auto-import -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp

C:\test\mingw>g++ -Wl,--enable-auto-import -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp

C:\test\mingw>vector_for_loop_02
17
12
23
42

 

이제 좀 더 편안한 방법을 찾아 보자.

윈도우즈 명령창에서 doskey 를 이용하여 명령 g++ -enable-auto-import 대신할 명령 s++ 를 생성한다.

C:\test\mingw>doskey s++=g++ -enable-auto-import $*

 

이제 s++ 명령으로 컴파일도 하고 실행도 해본다.

C:\test\mingw>s++ -std=c++0x -o vector_for_loop_02 vector_for_loop_02.cpp

C:\test\mingw>vector_for_loop_02
17
12
23
42

 

명렬창을 열때 미리 저런 doskey 설정을 해도 된다.  윈도우카+R 을 눌러서

 

처럼 입력하고 "획인 버튼을 누른다.  이제 새로 열린 명령창에서 컴파일하여 실행한다,

 

 

명령창을 열 때마다 저런 길다란 옵션을 외워서 쓰기도 번거롭다. 그래서 더 편안한 방법으로 "바로가기 명령창 아이콘"을 바탕화면에 링크시켜 놓는다.

 

이제 바탕화면에 깔린 저 아이콘에 마우스 우측 버튼을 클릭하여 속성을 설정한다. 성정할 부분은 아래의 두 그림 처럼 "대상(T)"과 "시작 위치(S)"이다. ("대상(T)" 부분에 입력할 글자가 길어서 그림을 두 개로 만들었다.)

 

 

 

 

이제 저 바탕화면을 클릭하면 g++ 명령 대신 s++ 명령으로 컴파일할 수 있다.

 

* 참고 자료: http://stackoverflow.com/questions/7742332/purpose-of-enable-auto-import-warning

 

 

Posted by Scripter
,