预处理器出现奇怪的错误

tha*_*ran 3 c c++

目前我对预处理器有一个非常奇怪的错误.我搜索过,找不到任何相关内容,因此想在此发布.以下是我的示例代码

#include <stdio.h>

#define DDR_BASEADDR  0x000000000U + 128*1024*1024

int main()
{
     uint32_t* test2 = (uint32_t*) DDR_BASEADDR;

     uint32_t whatIsThis = DDR_BASEADDR;

     uint32_t* test3 = (uint32_t*) whatIsThis;

     printf( "%x %x %x %x\n\r", DDR_BASEADDR, test2, test3, whatIsThis);

     return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出应该都是0x8000000.但是,产出是:8000000 20000000 8000000 8000000.

我相信这是不是导致此问题的数据类型,因为它也将出现,即使我改uint32_t* test2 = (uint32_t*) DDR_BASEADDR;int32_t* test2 = (int32_t*) DDR_BASEADDR;

我在Zedboard的ARM A9和C++在线编译器上测试了这一点,得到了相同的结果.感谢您的时间和精力.

Thang Tran

Bo *_*son 8

宏扩展给你

uint32_t* test2 = (uint32_t*) 0x000000000U + 128*1024*1024;
Run Code Online (Sandbox Code Playgroud)

当你可能期望的时候

uint32_t* test2 = (uint32_t*) (0x000000000U + 128*1024*1024);
Run Code Online (Sandbox Code Playgroud)

这就是为什么建议在宏定义中使用大量括号,或者 - 甚至更好 - 使用函数.

  • 不,宏不快.编译器已经知道如何内联函数,因为...我不知道,至少20年.@ tilz0R (3认同)
  • *或 - 甚至更好 - 使用函数.*你有一个理由为什么函数优于带括号的宏? (2认同)