gpt4 book ai didi

C++ include guards 似乎没有工作

转载 作者:太空狗 更新时间:2023-10-29 19:39:44 25 4
gpt4 key购买 nike

我从 mbed C++ 编译器收到错误消息,这些消息似乎表明包含保护程序出现故障。

在 main.cpp 中,我包含了我的头文件如下:

#include "mbed.h"
#include "sample.h"

这是我的示例.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

在 sample.cpp 中,我按如下方式包含 sample.h:

#include "sample.h"

在 main.cpp 和 sample.cpp 中,我指的是变量 led1、led2、led3、led4 而没有声明它们。但是,编译器正在输出这些投诉:

" Symbol led1 multiply defined (by sample.cpp.cpp.LPC1768.o and main.cpp.cpp.LPC1768.o)." ... " Symbol led4 multiply defined (by sample.cpp.cpp.LPC1768.o and main.cpp.cpp.LPC1768.o)."

我的 include guards 是不是写的不对?还是有其他问题?

(供引用,这里是 link to the mbed.h source )

最佳答案

这个问题是对 include 守卫所做的事情的误解。包含保护程序可防止编译器在相同的翻译单元(对于相同的 .cpp 文件)再次看到相同的内容。它们不会阻止不同的翻译单元看到相同的代码。

在头文件中,您定义(不仅仅是声明)变量。因此,每个包含 header 的翻译单元都会创建自己的这些变量拷贝。

正确的方法是在 .cpp 文件中定义变量,并且只在 header 中声明它们(包含保护应该在那里,以防止在同一翻译单元中多次包含)。

也就是说,在您的文件 sample.h 中,为您的变量添加前缀 extern 并删除初始化程序(因此它们仅被声明,未被定义),并在相应的 .cpp 文件中定义它们 (也定义了函数的那一个),方法是将标题中的确切定义放在那里。

在一个不相关的注释中,您应该将 #include "mbed.h" in sample.h 放在 include guards 中,因为一些编译器会优化此类 guards 的编译速度,而这种优化不会如果包含防护装置之外有 Material ,则无法使用。请注意,这并不是真正的正确性问题(假设 mbed.h 也受到 include 守卫的适当保护),而是编译性能问题。

关于C++ include guards 似乎没有工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com