从C编译器更改为C++编译器会导致MSP430固件的编译器错误
Change from C compiler to C++ compiler causes compiler errors for MSP430 firmware
我正试图用一个新的编译器(C++编译器,在Visual Studio下使用VisualGDB)为Texas Instruments MSP430微控制器编译一个久经考验的固件。
该固件的所有早期版本都是使用C编译器编译的,没有任何错误和警告。从C编译器到C++编译器的变化一定是我出现问题的原因。(用C编译器编译的代码已经运行了五年,没有出现任何问题。)
给定以下代码片段:
#include <msp430x14x.h>
WDTCTL = WDTPW+WDTHOLD;
我得到这个错误:
错误:"WDTCTL"未命名类型c:\mstest\LedBlink\LedBrink.cpp
WDTCLT在msp430x14x.h中声明。
有人能给我指正确的方向吗?
有两种可能:
每个编译器提供的- msp430x14x.h都是不同的-对于这样的头没有标准形式,每个供应商可能会对它们进行不同的定义
- 您正在将一个编译器的头与另一个编译器一起使用,并且它使用了不兼容的编译器扩展或语法
毫无疑问,这里有很多编译器特定的或"宏魔术"——您需要了解的是预处理器是如何扩展这些宏的。编译器抱怨的是扩展的代码,而不是你发布的源代码。
预处理器在这里被用来创建语法,否则这些语法将不是有效的C或C++,因此如果不考虑扩展,就无法确定太多。由于每个编译器都可能提供不同的msp430x14x.h,而不知道使用了什么C和C++编译器,因此对此也没有什么好说的。请记住,必须考虑完整扩展-因此,如果宏是根据其他宏定义的,则也必须扩展它们。GCC有一个n选项,顶部输出预处理器输出,或者您可以直接单独运行预处理器(可执行文件是"cpp")。
问题是WDTCTL
是使用sfrw
定义的,尽管代码中没有显示,但sfrw
在iomacros.h中定义为内联asm语句。很明显,内联asm将依赖于处理器,适用于msp430的东西在visualstudio中不起作用。
感谢所有回复。除了我提出的问题之外,这些回答都很有帮助。
我发现并纠正了这个问题。我必须承认,问题出在我身上是一个疏忽大意的错误。我把一个完整的C程序中的代码剪切粘贴到一个测试程序中,省略了
int main()
因此,编译器抱怨的赋值语句在源代码的错误范围内。
我过早地提出了我的问题。
也就是说,您的答案对于决定继续使用GCC编译器(使用Visual Studio作为IDE)或使用与我用于该固件的所有早期版本相同的编译器最有帮助。我从你提供的一组答案中学到了很多。
谢谢!
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 从C编译器更改为C++编译器会导致MSP430固件的编译器错误