C/C++ 静态巫毒教

C/C++ Static Voodoo

本文关键字:静态 C++      更新时间:2023-10-16

我正在开发一个包含 C 和 C++ 元素的程序。 我不能说我是这个领域的专家,但我注意到静态变量的行为并不是那么静态。 具体来说,我异步接收事件,然后将事件推送到静态队列,而主线程从该静态队列中弹出事件。 当我将事件推送到静态队列时,我可以清楚地告诉队列增加了 1 并且数据已正确填充。 当我从该静态队列轮询时,数据将进入并且队列大小为 0。 为了确认它们充当不同的实例,我从异步和轮询的角度打印了它们的值,即使变量附加了一个臭静态,它们也始终保持不同。 静态队列存储在 .c 文件中,而我从.cpp文件更新队列。 我几乎肯定这不会引起问题,但谁知道呢。 我被卡住了

这是我存储在interactivity_mapping文件中的两个变量...

/* Pointer storage */
static sdy_pointer_event_t pointer_events[MAX_POINTERS] = {0};
static int last_pointer_event = 0;

以下是存储在导入的函数c文件中的外部函数

/* Imported functions */
extern void GetId(SGLint32 (*WidgetId));
extern void ManageIndividualFocus(SGLbool RequestFocus, SGLbool RequestNoFocus, SGLint32 WidgetId, SGLbool IsContainer, SGLint32 NextWidgetId, SGLbool isInit, SGLint32 (*HasFocus));
extern void aol_keyboard(SGLint32 pKeyboard, SGLbool* pPressed, SGLbool* pReleased, SGLint32* pCode, SGLint32* pModifiers);
extern void aol_locate(SGLint32 pPointer, SGLfloat* pX, SGLfloat* pY);
extern void aol_pointer(SGLint32 pPointer, SGLbool* pPressed, SGLbool* pReleased, SGLint32* pButton, SGLfloat* pX, SGLfloat* pY, SGLint32* pModifiers);
extern void wrapper_PushButton(SGLint32 EmitCondition, SGLbool MouseInside, SGLbool MousePressed, SGLbool MouseReleased, SGLbool KeyPressed, SGLint32 KeyCode, SGLbool KeyReleased, SGLbool (*Selection), SGLbool (*ButtonPressed), wrapper_PushButton_mem* mem);
extern void wrapper_PushButton_reset(wrapper_PushButton_mem* mem);

基本上interactivity_mapping文件中有外部导入函数c文件的实现。 我异步调用的函数不是这个导入的函数 extern c 文件的一部分,而轮询函数是和被调用aol_pointer。 我不知道这是否会导致这种类型的错误行为。 该程序非常大,因此我认为如果不将整个内容倾倒在这里,我就无法提供更好的图片。

静态存储类意味着对象的生存期是程序的整个执行。变量的static规范意味着它具有静态存储类,并且符号(变量名称)仅在定义范围内可见,即当它在函数中时是块,当它在全局范围内时在翻译单元(.c 文件)中可见。

static并不意味着不能

通过函数或通过符号不可见位置的指针使用该元素。