基于构造函数的存在禁用代码
Disable code based on existence of Constructor
我试图根据代码是否创建对象(或调用函数或其他什么(来禁用一些代码。听起来有点奇怪,我知道。
在我的库中,可以创建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_ect(。ISR必须缺席。
附言:如果你需要更多的信息,我可以提供更多,但我尽量保持问题的基本
对于这种情况,通常要做的是将此类对象的代码编译到库中。链接器足够智能,可以检测主程序是否依赖于库中的任何函数。如果是这样,它将把该函数的整个编译单元(即.c或.cpp文件(加载到程序中。它在编译单元中找到的任何ISR都将添加到您的程序中。如果不使用库中的任何函数,则不会添加ISR。
例如,在foo1.h:中放入这样的内容
#pragma once
class Foo1 {
public:
Foo1();
};
在foo1.cpp:中放入类似的内容
#include <foo1.h>
ISR(TIMER1_COMPA_vect) {
}
Foo1::Foo1() {
}
现在应该使用avr-gcc
将foo1.cpp
编译为foo1.o
。接下来,使用avr-ar
将foo1.o
存储在名为foo1.a
的归档中。然后,使用avr-gcc
编译主程序,并提供foo1.a
作为参数。确保foo1.a
参数位于main.cpp
之后。
您可能需要创建一个单例。有许多例子。singleton是一个只构造自己一次的类。构造函数是私有的,静态方法检查一个"全局"变量,看看类是否已经构造好了,如果没有,它只构造自己一次。您可能需要考虑线程问题,尽管对于构造,您可以在创建多个类之前尽早引用该类。对于中断的多个用户,通常使用对象注册的某种调度器,然后调用对中断感兴趣的所有类。调度器可以是单例。通常,调度器的客户端实现一个接口。作为向调度器注册的一部分,类告诉调度器它的"this"指针,调度器可以调用从接口实现的方法,就像它们被正常调用一样。客户端不需要有静态方法。这种东西可能有一些模式,但我无法说出任何模式。
正如你所说,你的问题听起来很奇怪,但如果你只想做一次,比如说在构造函数中,你可以使用局部静态变量来处理一个简单但非常丑陋的事情
Foo:Foo() {
static bool init = true;
if( init ) {
//Some code for ISR init
init = false;
}
}
这样,您的特殊ISR初始化将只发生一次,无论您或您的用户构建的Foo对象的数量如何
编辑:
我认为没有办法实现你想要的,至少没有干净的方法。
我认为你的问题来自你的ISR宏,它实际上做了两件事:
- 初始化ISR矢量(ISR注册(
- 定义您的ISR处理程序(ISR处理程序(
为了解决您的问题,我建议您将其拆分为两个宏,然后:
- ISR注册进入Foo1/Foo2构造函数->使用全局字段或任何机制只初始化一次或在内部跟踪发生的事情
- 保留另一个仅包含处理程序定义的宏ISR_HANDLER
然后,您的处理程序可以保持定义状态,如果它没有被任何Foo类注册,则不应该有任何影响
- 为什么此代码存在运行时错误?
- 为什么以下C++代码中存在内存泄漏?
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 以下代码中存在哪些问题?
- 为什么此代码中存在分段错误?
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 当存在覆盖歧义函数时,代码如何运行?
- 基于构造函数的存在禁用代码
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 以下代码是否存在内存泄漏?
- 我的代码似乎在查找最大数字时存在语法错误
- 如何通过用C++编写的代码将位图图像保存在Android设备中
- 以下代码存在哪些问题?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?
- 在存在错误代码的情况下输出参数与 NRVO
- 代码中存在多个错误
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- 一些人发现此代码存在溢出问题.小的数字是非常负的
- 如何让代码存在于两个或多个非嵌套命名空间的范围内