gpt4 book ai didi

C++ 定义预处理器

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:41 24 4
gpt4 key购买 nike

我正在学习 C++,我们正在学习预处理器,但我正在尝试解决一个测验中的问题,这个问题让我有些困惑。我在运行程序之前尝试自己解决问题。我的输出是..

System started...
Data at 2 is: 27 28 29 30
Data at 1 is: 23 24 25 26
The data is: 19

我检查了 Xcode 中的程序,看我的输出是否正确,但正确的输出是下一个:

System started...
Data at 1 is: 0 0 0 19
Data at 0 is: 7 0 0 0
The data is: 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 在内存中的布局。

内存内容,按字节,看起来像这样(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,即a

sizeof(a)sizeof(b[0]) 不同,因为 uint 有 2 种不同的类型定义。即,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)));

关于C++ 定义预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com