gpt4 book ai didi

c - #定义相关查询

转载 作者:行者123 更新时间:2023-11-30 15:58:32 24 4
gpt4 key购买 nike

我正在将代码从 Linux 移植到 Windows。我使用的是Visual Studio环境。我被一个问题困住了。

Windows 中有一个带有 2 个参数的函数调用,用于获取和释放信号量。Linux代码只有一个参数
窗口:

KeInitializeSpinLock(spinlock,oldIRQL);

Linux

spin_lock_init(spinlock);

我有一个通用调用,我必须使用它:

Get_Lock(spinlock);

如何在不更改 Get_Lock 原型(prototype)的情况下对 Windows 执行此操作?

我尝试了以下方法:

#define Get_Lock(lock) \

KIRQL oldIrql;\

KeAcquireSpinLock(&(lock),&oldIrql);

#define Release_Lock(sync) KeReleaseSpinLock(&(sync),oldIrql)

但是编译器给出了错误..基本上我想保留 oldIrql 的值,因为 KeReleaseSpinLock 需要该值

错误

error C2275: 'KIRQL' : illegal use of this type as an expression
error C2146: syntax error : missing ';' before identifier 'oldIrql'
error C2065: 'oldIrql' : undeclared identifier
error C2065: 'oldIrql' : undeclared identifier
error C2065: 'oldIrql' : undeclared identifier

KIRQL 定义为

typedef UCHAR KIRQL

我在这里做错了什么?或者是否有其他方法可以在不更改 Get_LockRelease_Lock 原型(prototype)的情况下使用?

最佳答案

该问题是由于 Microsoft 编译器仅支持 C89 标准,该标准不允许代码和声明混合。 Get_Lock() 在一行代码之后被调用(我怀疑),这引入了 oldIrql 的声明。

如果是在同一范围内获取和释放锁的情况,则始终可能的修复(黑客)是在 范围的顶部声明 KIRQL oldIrql;调用 Get_Lock()Release_Lock(),并从 Get_Lock() 中删除声明。

更简洁的解决方案是消除宏并引入一个定义锁的新struct。例如:

typedef struct _lock
{
#ifdef WIN32
UCHAR oldIrql;
PKSPIN_LOCK sem;
#else
#endif
} lock;

lock* lock_new()
{
lock* result = malloc(sizeof(lock));

/* Perform OS dependent initialisation. */
#ifdef WIN32
#else
#endif
return result;
}

void lock_delete(lock* aLock)
{
/* Perform OS dependent tidy tasks. */
#ifdef WIN32
#else
#endif
free(aLock);
}

void lock_obtain(lock* aLock)
{
/* OS dependent acquire. */
#ifdef WIN32
KeAcquireSpinLock(&aLock->sem, &aLock->oldIrql);
#else
#endif
}

void lock_release(lock* aLock)
{
/* OS dependent release. */
#ifdef WIN32
KeReleaseSpinLock(&aLock->sem, aLock->oldIrql);
#else
#endif
}

关于c - #定义相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9669091/

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