C++ 如何防止从某些代码段调用函数?
我正在实现一个helper类,它有许多有用的函数,这些函数将在大量的类中使用。然而,其中有一些并不是设计用来从某些代码段中调用的(从中断函数,这是一个嵌入式项目) 但是,对于此类用户来说,某些函数被允许而另一些函数被禁止从中断函数调用的原因可能不是很明显,在许多情况下,被禁止的函数可能会工作,但可能会导致以后非常微妙和难以发现的错误 对我来说,最好的解决方案是,如果从不应该从中调用的代码段调用有问题的函数,则会导致编译器错误 我也考虑过一些非技术性的解决方案,但最好是技术性的C++ 如何防止从某些代码段调用函数?,c++,c,c-preprocessor,C++,C,C Preprocessor,我正在实现一个helper类,它有许多有用的函数,这些函数将在大量的类中使用。然而,其中有一些并不是设计用来从某些代码段中调用的(从中断函数,这是一个嵌入式项目) 但是,对于此类用户来说,某些函数被允许而另一些函数被禁止从中断函数调用的原因可能不是很明显,在许多情况下,被禁止的函数可能会工作,但可能会导致以后非常微妙和难以发现的错误 对我来说,最好的解决方案是,如果从不应该从中调用的代码段调用有问题的函数,则会导致编译器错误 我也考虑过一些非技术性的解决方案,但最好是技术性的 在文档中用警告指示
read_byte()
,为什么会有人研究文档中的函数是否可重入#define
,在每个中断的结尾定义一个#unde
,在有问题的函数的开头定义一个#ifdef
,这种天真的方法是行不通的,因为预处理器不关心作用域受到保护
,并在使用它们的所有类中将它们声明为朋友
。这样,就不可能从中断中直接使用它们。由于main()
是无类的,我必须将它的大部分放在类方法中。我不太喜欢这个,因为它可能变得不必要的复杂,并且它产生的错误并不明显(因此这个函数的用户可能会封装它们来“解决”问题,而没有意识到真正的问题是什么)。编译器或链接器错误消息(如“error:function_name()不能在中断中使用”)更可取仅使用C中可用功能的解决方案也是可以接受的,甚至更可取。如果所有中断例程都有一个文件,那么这可能会有帮助: 在类头中定义一个宏,比如禁止中断例程访问。 在中断处理程序文件中检查宏定义:
#ifdef FORBID_INTERRUPT_ROUTINE_ACCESS
#error : cannot access function from interrupt handlers.
#endif
如果有人为该类添加头文件,以便在中断处理程序中使用该类,那么它将抛出一个错误
注意:必须通过指定警告将被视为错误来构建目标。如果所有中断例程都有一个文件,那么这可能会有帮助: 在类头中定义一个宏,比如禁止中断例程访问。 在中断处理程序文件中检查宏定义:
#ifdef FORBID_INTERRUPT_ROUTINE_ACCESS
#error : cannot access function from interrupt handlers.
#endif
如果有人为该类添加头文件,以便在中断处理程序中使用该类,那么它将抛出一个错误
注意:您必须通过指定警告将被视为错误来构建目标。下面的一些注释。作为一个警告,阅读它们不会很有趣,但我不会不指出这里的问题而为你服务
- 如果您是从ISR内部调用外部函数,那么任何文档或编码都无法帮助您。因为在大多数情况下,这样做是不好的做法。程序员必须知道他们在做什么,否则任何文档或编码机制都无法保存程序 程序员设计库函数并不是为了从ISR内部调用。相反,程序员设计ISR:S中带有ISR的所有特殊限制:确保中断标志被正确清除,保持代码简短,不调用外部函数,不要比必要的时间更长地阻塞MCU,考虑重新入侵者,考虑危险的编译器优化(使用易失性)。不知道这一点的人不足以编写ISR
- 如果您实际上有一个函数
,那么这表明程序设计一开始就不好。此函数可以执行以下两项操作之一:int read\u byte(int address)
- 或者它可以在一些外围硬件上读取一个字节,在这种情况下,函数
class Handy_Base { protected: static int Handy_protected() { return 0; } public: static int Handy_public() { return 0; } };
template< class Is_Interrupt_Handler > class Handy_functions;
// Functions can be used when inside an interrupt handler template<> struct Handy_functions< In_Interrupt_Handler > : Handy_Base { static int Handy1() { return 1; } static int Handy2() { return 2; } }; // Functions can be used when inside any function template<> struct Handy_functions< In_Non_Interrupt_Handler > : Handy_Base { static int Handy1() { return 4; } static int Handy2() { return 8; } };
int main() { using IH_funcs = Handy_functions<In_Interrupt_Handler>; std::cout << IH_funcs::Handy1() << '\n'; std::cout << IH_funcs::Handy2() << '\n'; using Non_IH_funcs = Handy_functions<In_Non_Interrupt_Handler>; std::cout << Non_IH_funcs::Handy1() << '\n'; std::cout << Non_IH_funcs::Handy2() << '\n'; }
- 或者它可以在一些外围硬件上读取一个字节,在这种情况下,函数