2012年7月3日 星期二

Using C++11 in Xcode

since: 2012/07/03
update: 2012/07/03

reference:
1. Arne's Blog: What about C++11 in Xcode?
2. Sams Teach Yourself C++ in One Hour a Day, 7/e

A. 新增專案:
      Xcode > File > New > Project... > Mac OS X > Application >
      Command Line Tool > Next

      Product Name: HelloC++11
      Company Identifier: com.blogspot
      Type: C++
      Use Automatic Reference Counting: unchecked
      > Next > Create

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

B. 使用 C++11 的 auto 關鍵字: (利用編譯器的型別推斷能力)
      1. 說明:
          a. 在 C++11 中, 你可以選擇不需要明確地指定變數的型別, 而是使用
              auto 關鍵字來替代. 使用 auto 關鍵字, 變數的型別將藉由給予變數的
              初始值來決定.

          b. 承上, 為變數定義正確型別的任務將由編譯器來處理. 編譯器所作的事,
              是去檢查變數初始化的值, 然後決定符合此變數的最佳可能型別.

          c. 使用 auto 關鍵字時, 需要給予變數初始值, 好讓編譯器能決定其型別
              不然的話, 會得到編譯錯誤的訊息.

************************************************

      2. 開啟 main.cpp 檔案, 修改如下:
#include <iostream>

//@add
using namespace std;

int main(int argc, const char * argv[])
{
    // insert code here...
    //std::cout << "Hello, World!\n";
   
    //@use auto
    auto Flag = true;
   
    cout << "Flag = " << Flag;
    cout << " , sizeof(Flag) = " << sizeof(Flag) << endl;
   
    return 0;
}

說明: 在使用 auto 的地方, 會出現警告訊息:

************************************************

      3. 修改編譯器設定:
           預設的設定:

           調整成以下:

           說明: 之前的警告訊息消失了.

************************************************

      4. 編譯並執行:
           Flag = 1 , sizeof(Flag) = 1

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

C. 在複雜型別中使用 auto 來簡化程式碼: (特別是在使用樣板時)
      1. 開啟 main.cpp 檔案, 修改如下:
#include <iostream>
//@add
#include <vector>

//@add
using namespace std;

int main(int argc, const char * argv[])
{
    // insert code here...
    //std::cout << "Hello, World!\n";
   
    //@use auto
    /*
    auto Flag = true;
   
    cout << "Flag = " << Flag;
    cout << " , sizeof(Flag) = " << sizeof(Flag) << endl;
    */
   
    //@add: dynamic array of integers
    vector<int> MyNumbers;
   
    // 將一些元素放入 vector 中 (每次向容器後面添加一個值)
    MyNumbers.push_back(100);
    MyNumbers.push_back(200);
    MyNumbers.push_back(300);
    MyNumbers.push_back(400);
    MyNumbers.push_back(500);
   
    // 顯示所存放的元素(原始方式)
    //
    // Iterator 變數的型別為: vector<int>::const_iterator
    for (vector<int>::const_iterator Iterator = MyNumbers.begin();
         Iterator < MyNumbers.end();
         ++Iterator) {
       
        cout << *Iterator << " ";
    }
   
    return 0;
}

編譯並執行:
100 200 300 400 500

************************************************

      2. 改成使用 auto:
....
int main(int argc, const char * argv[])
{
    //@add: dynamic array of integers
    vector<int> MyNumbers;
   
    // 將一些元素放入 vector 中 (每次向容器後面添加一個值)
    MyNumbers.push_back(100);
    MyNumbers.push_back(200);
    MyNumbers.push_back(300);
    MyNumbers.push_back(400);
    MyNumbers.push_back(500);
   
    // 顯示所存放的元素(原始方式)
    //
    // Iterator 變數的型別為: vector<int>::const_iterator
    /*
    for (vector<int>::const_iterator Iterator = MyNumbers.begin();
         Iterator < MyNumbers.end();
         ++Iterator) {
       
        cout << *Iterator << " ";
    }
    */
    //@update: use auto
    for (auto Iterator = MyNumbers.begin();
         Iterator < MyNumbers.end();
         ++Iterator) {
       
        cout << *Iterator << " ";
    }
   
    return 0;
}

編譯並執行:
100 200 300 400 500

說明:
在 auto 那一行, 編譯器檢查 Iterator 的初始值(為 MyNumbers.begin()回傳值),
並將 Iterator 變數的型別設為與 MyNumbers.begin() 的回傳值之型別相同.
(i.e. vector<int>::const_iterator)  

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。