我正在尝试使用新编译器(使用VisualGDB在Visual Studio下使用C ++编译器)为德州仪器MSP430微控制器编译一个经过验证的固件固件。
此固件的所有先前版本均使用C编译器编译,零错误和零警告。从C编译器到C ++编译器的更改必定是我的问题的原因。 (使用C编译器编译的代码已运行五年没有问题。)
鉴于此代码段:
#include <msp430x14x.h>
WDTCTL = WDTPW+WDTHOLD;
我收到此错误:
错误:'WDTCTL'没有命名类型c:\ msptest \ LedBlink \ LedBlink.cpp
WDTCLT在msp430x14x.h中声明。
有人可以指出我正确的方向吗?
答案 0 :(得分:3)
有两件事是可能的:
毫无疑问,这里有大量编译器特定或“宏魔术” - 您需要了解的是预处理器如何扩展这些宏。编译器抱怨扩展的代码,而不是你发布的源代码。
此处使用预处理器来创建无法有效的C或C ++语法,因此不考虑扩展,可以确定的不多。并且由于每个编译器可能提供不同的msp430x14x.h,而不知道究竟是什么C和使用了什么C ++编译器,因此也不能说很多。请记住,必须考虑完整扩展 - 因此,如果宏是根据其他宏定义的,那么它们也必须进行扩展。 GCC有一个n选项顶部输出预处理器输出,或者你可以直接单独运行预处理器(可执行文件是“cpp”)。
答案 1 :(得分:0)
问题在于WDTCTL
是使用sfrw
定义的,虽然代码中未显示sfrw
,但{{1}}中的{{1}}定义为内联asm语句。显然,内联asm将依赖于处理器,对msp430有效的功能将无法在visual studio中使用。
答案 2 :(得分:0)
感谢所有回复的人。除了我提出的问题之外,回复是有帮助的。
我找到并纠正了这个问题。我必须承认,问题是我的疏忽错误。我将已完成的C程序中的代码剪切并粘贴到测试程序中,省略
int main()
因此,编译器抱怨的赋值语句在源代码的不正确范围内。
我过早地发布了我的问题。
也就是说,您的答案最有助于决定继续使用GCC编译器(使用Visual Studio作为IDE),或者使用我用于此固件所有先前版本的相同编译器。我从你提供的一系列答案中学到了很多东西。
谢谢!