使用.h extern声明声明.cpp中的全局常量与声明.cpp文件中的常量之间有什么区别?

时间:2016-11-18 19:13:28

标签: c++

我已经找到了我的问题的解决方案,但是,我不明白为什么这是一个问题,我想我会在这里要求更好地理解事情。

我已经在Atmel Studio 7中开发了一个atmega微应用程序。我用c ++编写的这个项目只是作为一个实验以相当安全的方式编写的。以前的嵌入式项目纯粹是在C语言中。无论如何,我正在编写应用程序的单元测试,我发现之前已经过去的测试现在已经失败了。情况:

有5个感兴趣的文件:

main.cpp  
constants.h  
UART.cpp  
UART.h  
UART_tests.h  

在main.cpp中我声明了一个常数:
const unsigned long SERIAL_NUMBER = 0x00123456;
在constants.h中我将此变量作为extern:
extern const unsgigned long SERIAL_NUMBER

在UART_tests.h中我有这样的测试:

ASSERT_EQUALS("\t\tHB", ((byte)(SERIAL_NUMBER >> 24)), mResponseBuffer[6])
ASSERT_EQUALS("\t\tMHB", ((byte)((SERIAL_NUMBER & 0x00FF0000) >> 16)), mResponseBuffer[7])
ASSERT_EQUALS("\t\tMLB", ((byte)((SERIAL_NUMBER & 0x0000FF00) >> 8)), mResponseBuffer[8])
ASSERT_EQUALS("\t\tLB", ((byte)(SERIAL_NUMBER & 0x000000FF)), mResponseBuffer[9]) 

ASSERT_EQUALS测试看起来像:

#define ASSERT_EQUALS(TEST, A, B) if(A != B){ \
                sprintf(buffer, equals, TEST, A, B); \
                UART_writeStringPolling(buffer); \
                test = false;}

用equals string作为:
const char equals[] = "%s expected %02d got %02d\r\n";

mResponseBuffer填充在我正在测试感兴趣的语句的函数中:

case GET_SERIAL_NUMBER:
    buildResponse(SERIAL_NUMBER);
    sendResponse();  
    break; 

...  

bool buildResponse(const unsigned long b)
{
   byte b1, b2, b3, b4;

   b4 = (byte)b;
   b3 = (byte)(b >> 8);
   b2 = (byte)(b >> 16);
   b1 = (byte)(b >> 24);

   if(mResponseSize >= UART_BUFFER_SIZE-4)
      return false;

   mResponseBuffer[++mResponseSize] = b1;
   mResponseBuffer[++mResponseSize] = b2;
   mResponseBuffer[++mResponseSize] = b3;
   mResponseBuffer[++mResponseSize] = b4;

   return true;
}

所以现在所有这些设置完成我遇到的问题是放在mResponseBuffer中的值不是SERIAL_NUMBER的实际值!实际上我的调试器甚至报告了SERIAL_NUMBER的错误值!所以测试会失败,我会得到一条消息:

Testing GET_SERIAL_NUMBER:
    HB expected 00 got 03
    MHB expected 18 got 24
    MLB expected 52 got 00
    LB expected 86 got 05
    Test Failed

预期值是正确的!但是,即使调用此命令,调试器也会显示SERIAL_NUMBER的错误值。因此,似乎extern不仅被错误地解决,而且取决于代码中的位置不同!

解决方案是从main.cpp中取出SERIAL_NUMBER的声明并将其放在constants.h中。最后,我的问题是为什么?

0 个答案:

没有答案