gpt4 book ai didi

c++ - 基于构造函数的存在禁用代码

转载 作者:行者123 更新时间:2023-11-28 04:35:56 26 4
gpt4 key购买 nike

我试图根据代码是否创建对象(或调用函数或其他)来禁用某些代码。我知道这听起来有点奇怪。

在我的库中可以创建 2 个对象,每个对象都需要一个中断服务例程,例如:

ISR(TIMER0_COMPA_vect) {
// do some stuff if the interrupt happens
}

ISR 只能创建一次,但用户可能只创建一个对象或不创建任何对象,因此不应首先创建 ISR,以免阻止用户创建对象。我知道像这样封装代码会很容易

#ifdef OBJECT1
ISR(TIMER0_COMPA_vect) {
// do some stuff if the interrupt happens
}
#endif

但这会迫使用户跟踪她/他创建的对象。是否有一个选项可以让预处理器决定构造函数是否被调用一次甚至存在?有点像这样的东西

Foo:Foo() {
#define USE_FOO
//Some code
}

#ifdef USE_FOO
ISR(TIMER0_COMPA_vect) {
// do some stuff if the interrupt happens
}
#endif

编辑:

根据我得到的答案,我试着澄清一下我的问题:

Foo1:Foo1() {
//Some object constructor code
}

Foo2:Foo2() {
//Some object constructor code
}

ISR(TIMER1_COMPA_vect) {
//some interrupt code
}

ISR(TIMER2_COMPA_vect) {
//some interrupt code
}

int main() {
Foo2 foo2;
}

如果这是我们正在谈论的代码,则根本不应编译函数 ISR(TIMER1_COMPA_vect)。 ISR 必须不存在。

PS:如果你需要更多信息,我可以提供更多,但我尽量让问题尽可能简单

最佳答案

对于这种情况,您通常会做的是将此类对象的代码编译到一个库中。链接器足够智能,可以检测您的主程序是否依赖库中的任何函数。如果是,它将将该函数的整个编译单元(即 .c 或 .cpp 文件)加载到您的程序中。它在编译单元中找到的任何 ISR 都将添加到您的程序中。如果您不使用库中的任何函数,则不会添加 ISR。

例如,在 foo1.h 中放入这样的内容:

#pragma once
class Foo1 {
public:
Foo1();
};

在 foo1.cpp 中加入类似这样的内容:

#include <foo1.h>

ISR(TIMER1_COMPA_vect) {
}

Foo1::Foo1() {
}

现在您应该使用avr-gccfoo1.cpp 编译成foo1.o。接下来,使用 avr-arfoo1.o 存储在名为 foo1.a 的存档中。然后,使用 avr-gcc 编译您的主程序,并提供 foo1.a 作为参数。确保 foo1.a 参数出现在 main.cpp 之后。

关于c++ - 基于构造函数的存在禁用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51444202/

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