2013-10-28 147 views
2

我正在學習C++,我們正在研究預處理器,但我試圖解決一個測驗中的一個問題,這個問題讓我有點困惑或者很多..我試圖在運行程序..和我的輸出以2爲..C++定義預處理器

系統開始...
數據是:在1 27 28 29 30
數據是:23 24 25 26
的數據是:19

我在Xcode中檢查了程序t Ø看看我的輸出是正確的,但正確的輸出是下一個:

系統開始...
數據以1:0 0 0 0 19
數據是:7 0 0 0
的數據是:19 0 0 0

這是代碼...

#include <iostream> 

namespace test{ 
#define COMPILE_FAST 
#define PRINT_SPLIT(v) std::cout << (int)*((char*)(v)) << ' ' << \ 
(int)*((char*)(v) + 1) << ' ' << (int)*((char*)(v) +2) << ' ' << \ 
(int)*((char*)(v) + 3) << std::endl 

    typedef unsigned long long uint; 
    namespace er{ 
     typedef unsigned int uint; 
    } 
    void debug(void* data, int size = 0){ 
     if(size==0){ 
      std::cout << "The data is: "; 
      PRINT_SPLIT(data); 
     } else { 
      while(size--){ 
       std::cout << "Data at " << size << " is: "; 
       char* a = (char*)data; 
       PRINT_SPLIT((a + (4+size))); 
      } 
     } 
    } 
}// End of Test namespace... 

int main(){ 
    test::uint a = 19; 
    test::er::uint b[] = {256,7}; 
    std::cout << "System started..." << std::endl; 
    test::debug(b,2); 
    test::debug(&a); 
    std::cout << "Test complete"; 
    return 0; 
} 

我最大的疑問還是什麼其實我不明白是什麼回事呢在這種預處理,因爲顯然對我所做的完全錯誤的......

#define PRINT_SPLIT(v) std::cout << (int)*((char*)(v)) << ' ' << \ 
(int)*((char*)(v) + 1) << ' ' << (int)*((char*)(v) +2) << ' ' << \ 
(int)*((char*)(v) + 3) << std::endl 

如果有人能這麼漂亮,給我一個簡要的解釋,我將非常感激。

+0

' 4 + size'應該是'4 * size'(或者更好,sizeof(int)* size') –

回答

1

該宏打印4個連續字節的值(如整數)。它可以讓你看到如何在內存中放置一個4字節的int。

存儲器中的內容,由字節,如下所示(base10):

0x22abf0:  0  1  0  0  7  0  0  0 
0x22abf8:  19  0  0  0  0  0  0  0 
  • 0 1 0 0是256,即B [0]
  • 7 0 0 0是7,即字母b [1]
  • 19 0 0 0 0 0 0 0是19,即

sizeof(a)sizeof(b[0])不同,因爲有2周不同的typedef爲uint。即,test:uinttest::er::uint

即使在a之後聲明b,因爲堆棧在內存中向下增長,所以地址a大於地址b[]

最後,我要說的輸出代表有缺陷的程序,因爲輸出會更加合理地:

System started... 
Data at 1 is: 7 0 0 0 
Data at 0 is: 0 1 0 0 
The data is: 19 0 0 0 

要獲得輸出的程序需要進行如下修改:

  while(size--){ 
      std::cout << "Data at " << size << " is: "; 
      int* a = (int*)data; 
      PRINT_SPLIT((a + (size))); 
+0

非常感謝..我更瞭解那裏發生了什麼.. – valbu17