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 个连续字节的值(作为整数)。它允许您查看 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:uint
和test::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)));
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?