gpt4 book ai didi

C、宏参数、参数替换

转载 作者:行者123 更新时间:2023-11-30 18:28:08 25 4
gpt4 key购买 nike

我有一个旧代码,编译得很好(还有用于 NXP micro 的 gcc,不记得是哪个版本)

#define TIME_CONSTANT     250,mSec

if (SysTimerOnTime(tmr, TIME_CONSTANT))
{

}

现在我尝试对 ESP8266 做同样的事情,使用 gcc for Xtensa

xtensa-lx106-elf-gcc.exe (GCC) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我正在使用 -std=c99 (因为一些内联 asm)

提示是关于在 SysTimerOnTime 宏中传递 2 个参数,而该宏需要 3 个参数。所以如果我使用:

if (SysTimerOnTime(tmr, 250, mSec)) 

可以正常工作。

会出现什么问题吗?

我确信在 LpcXpresso 中工作得很好(还有 gcc),但是,我现在无法测试,因为不再安装工具链。

宏应该是这样的

#define SysTimerOnTime(t,v,unit)    (t.Enable && (Now()-t.Value) > unit(v))

似乎双重间接解决了问题。也许 LPCXpresso 使用了较旧的编译器。没关系,这有效,谢谢 Jonathan Leffler

#define TIME_CONSTANT     250,mSec
#define SysTimerOnTime_(t,v,unit) (t.Enable && (Now()-t.Value) > unit(v))
#define SysTimerOnTimeX(x) x
#define SysTimerOnTime(tmr, con) SysTimerOnTimeX(SysTimerOnTime_(tmr, con))

最佳答案

当评估 SysTimerOnTime() 的调用时,会在参数扩展之前收集参数。只有两个参数——因此宏被错误地调用。您必须引入一定程度的间接才能使用 TIME_CONSTANT 宏。例如:

#define SysTimerOnTimeC(tmr, con) SysTimerOnTimeX(SysTimerOnTime(tmr, con))
#define SysTimerOnTimeX(x) x

然后你可以调用:

if (SysTimerOnTimeC(tmr, TIME_CONSTANT))
{

}

C 代表“常数”; X 代表“扩展”。您不能直接从代码中调用 SysTimerOnTimeX() 宏;它只是一个辅助宏。

我不禁觉得你最好这样做:

#define QUARTER_SECOND mSec(250)
#define SysTimerOnTime(t, v) ((t).Enable && (Now()-(t).Value) > (v))

然后调用:

if (SysTimerOnTime(tmr, QUARTER_SECOND)) 
{

}

我还在此处的扩展中将两个参数括起来。这是传统且普遍合理的建议(尽管绝对不是答案主要部分想要的内容)。如果没有括号,如果您调用过,您会收到编译器的投诉:

if (SysTimerOnTime(*ptr, QUARTER_SECOND))

因为*的优先级低于.。额外的括号应应用于基本 SysTimerOnTime 宏。

关于C、宏参数、参数替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49537776/

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