__func与__FUNCTION__的区别
时间: 2024-06-16 14:02:47 浏览: 132
__func__和__FUNCTION__都是预定义的宏,用于获取当前函数的名称。它们的区别在于:
- __func__是C99标准引入的宏,用于获取当前函数的名称,返回一个字符串常量。它可以在任何函数内部使用,包括全局函数和静态函数。
- __FUNCTION__是C语言和C++语言都支持的宏,用于获取当前函数的名称,返回一个字符串常量。它只能在全局作用域和命名空间作用域内使用,不能在函数内部使用。
总结一下:
- __func__可以在任何函数内部使用,包括全局函数和静态函数。
- __FUNCTION__只能在全局作用域和命名空间作用域内使用,不能在函数内部使用。
相关问题
function Trig_blizzard_intelligence________2_Func002002003001 takes nothing returns boolean return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false ) endfunction function Trig_blizzard_intelligence________2_Func002002003002001 takes nothing returns boolean return ( IsUnitAliveBJ(GetFilterUnit()) == true ) endfunction function Trig_blizzard_intelligence________2_Func002002003002002 takes nothing returns boolean return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_blizzard_hero)) == true ) endfunction function Trig_blizzard_intelligence________2_Func002002003002 takes nothing returns boolean return GetBooleanAnd( Trig_blizzard_intelligence________2_Func002002003002001(), Trig_blizzard_intelligence________2_Func002002003002002() ) endfunction function Trig_blizzard_intelligence________2_Func002002003 takes nothing returns boolean return GetBooleanAnd( Trig_blizzard_intelligence________2_Func002002003001(), Trig_blizzard_intelligence________2_Func002002003002() ) endfunction function Trig_blizzard_intelligence________2_Func003A takes nothing returns nothing call AddSpecialEffectTargetUnitBJ( "overhead", GetEnumUnit(), "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" ) call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(udg_blizzard_hero), udg_blizzard_p, bj_UNIT_FACING ) call UnitDamageTargetBJ( bj_lastCreatedUnit, GetEnumUnit(), ( I2R(GetHeroInt(udg_blizzard_hero, true)) * 0.65 ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD ) endfunction function Trig_blizzard_intelligence________2_Actions takes nothing returns nothing call YDWELocalVariableInitiliation( ) call YDWESetLocalVariableGroup( "g", GetUnitsInRangeOfLocMatching(BlzGetAbilityRealLevelField(BlzGetUnitAbility(udg_blizzard_hero, 'AHMB'), ABILITY_RLF_AREA_OF_EFFECT, GetUnitAbilityLevelSwapped('AHMB', udg_blizzard_hero)), udg_blizzard_p, Condition(function Trig_blizzard_intelligence________2_Func002002003)) ) call ForGroup( YDWEGetLocalVariableGroup("g"), function Trig_blizzard_intelligence________2_Func003A ) call GroupClear( YDWEGetLocalVariableGroup("g") ) call DestroyGroup( YDWEGetLocalVariableGroup("g") ) call YDWELocalVariableEnd( ) endfunction //=========================================================================== function InitTrig_blizzard_intelligence________2 takes nothing returns nothing set gg_trg_blizzard_intelligence________2 = CreateTrigger( ) call TriggerRegisterTimerExpireEventBJ( gg_trg_blizzard_intelligence________2, udg_blizzard_inte ) call TriggerAddAction( gg_trg_blizzard_intelligence________2, function Trig_blizzard_intelligence________2_Actions ) endfunction这段代码
这段代码是用来实现一个"暴风雪智能"的触发器,具体实现了以下功能:
1. 当触发器计时器到期时,会获取在指定地点范围内的所有敌方单位,并对其施加"overhead"特效,并在其位置创建一个新单位。
2. 会对获取的敌方单位造成伤害,伤害值是英雄的智力值的0.65倍。
3. 使用了几个函数来过滤单位,确保只对符合条件的单位进行操作。
__FUNCTION__和__func__的区别
`__FUNCTION__` 和 `__func__` 都是 C 语言中用于获取当前函数名的内置变量,但是它们的使用方式有所不同,具体区别如下:
1. `__FUNCTION__` 是 GCC 扩展,而 `__func__` 是标准 C99 中引入的。
2. `__FUNCTION__` 会被展开为当前函数的函数名字符串常量,但是在嵌套函数中,它会被展开为完整的函数名,包括命名空间和类名等。而 `__func__` 只会被展开为当前函数的函数名字符串常量。
3. 在 C99 标准中,`__func__` 是保留关键字,不能作为函数名或变量名使用。而 `__FUNCTION__` 不是保留关键字,在某些编译器中可能会定义为宏而不是变量。
因此,在通常情况下,建议使用 `__func__` 来获取当前函数名,这是 C99 标准中定义的,具有可移植性和兼容性。而 `__FUNCTION__` 可以作为一种扩展使用,在某些特定场景下可能会有用。
阅读全文