我从mbed C++编译器收到的错误消息似乎表明包括警卫在内的故障.
在main.cpp中,我包含我的头文件如下:
#include "mbed.h"
#include "sample.h"
Run Code Online (Sandbox Code Playgroud)
这是我的sample.h:
#include "mbed.h"
#ifndef STUFF_H
#define STUFF_H
/* LEDs */
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
/* Subroutines */
void sweepLEDs();
void pulseLEDs(int numPulses);
void clearLEDs();
#endif
Run Code Online (Sandbox Code Playgroud)
在sample.cpp中,我包括sample.h,如下所示:
#include "sample.h"
Run Code Online (Sandbox Code Playgroud)
在main.cpp和sample.cpp中,我指的是变量led1, led2, led3, led4而没有声明它们.但是,编译器正在输出这些投诉:
"符号led1多次定义(通过sample.cpp.cpp.LPC1768.o和main.cpp.cpp.LPC1768.o)." ..."符号led4多重定义(通过sample.cpp.cpp.LPC1768.o和main.cpp.cpp.LPC1768.o)."
我的包括卫兵写得不正确吗?还是有其他问题吗?
cel*_*chk 13
问题在于对包括警卫在内的内容的误解.包含防护可防止编译器在同一翻译单元中再次看到相同的内容(对于相同的.cpp文件).它们不会阻止单独的翻译单元看到相同的代码.
在头文件中,您定义(而不仅仅是声明)变量.因此,包含标题的每个翻译单元都会创建自己的变量副本.
正确的方法是在.cpp文件中定义变量,并且只在标题中声明它们(无论如何,包含保护应该在那里,以防止多个包含在同一个翻译单元中).
也就是说,在你的文件sample.h中,为变量添加前缀extern并删除初始值设定项(因此它们只是声明,未定义),并在相应的.cpp文件(定义函数的文件)中定义它们,在那里放置标题中的确切定义.
在一个不相关的注释中,你应该把#include "mbed.h"sample.h放在include guard中,因为有些编译器可以优化这些防护的编译速度,如果包含防护之外的材料,优化不起作用.请注意,这不是一个真正的正确性问题(假设mbed.h也受到包含保护的适当保护),但是编译性能问题.
| 归档时间: |
|
| 查看次数: |
4189 次 |
| 最近记录: |