簡體   English   中英

C ++定義預處理器

[英]C++ define preprocessor

我正在學習C ++,對,我們正在討論預處理器,但是我試圖解決一個測驗中的一個問題,這個問題使我有些困惑。.在運行程序之前,我嘗試自己動手..和我的輸出是..

系統已啟動...
2處的數據是:27 28 29 30
1處的數據是:23 24 25 26
數據為:19

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

系統已啟動...
1處的數據是:0 0 0 19
0處的數據是: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

如果有人可以這么友善並給我一個簡短的解釋,我將非常感激。

宏打印4個連續字節的值(以int為單位)。 它使您可以查看如何在內存中布置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])不同,因為uint有2種不同的typedef。 即, test:uinttest::er::uint

的地址a比的地址大b[]即使b的后宣布a ,因為堆棧在存儲器中向下生長。

最后,我想說輸出代表有缺陷的程序,因為輸出更合理地是:

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)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM