C++定义预处理器

C++ define preprocessor

本文关键字:处理器 预处理 定义 C++      更新时间:2023-10-16

我正在学习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 个连续字节的值(作为整数)。它允许您查看 4 字节 int 在内存中的布局方式。

内存内容按字节如下所示(基数10):

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 0 是 19,即 a

sizeof(a)sizeof(b[0])不同,因为uint有 2 种不同的 typedefs 。即test:uinttest::er::uint.

即使 b 是在 a 之后声明的,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)));