有没有办法写一个知道另一个宏使用了多少次的宏?

时间:2014-02-21 11:08:21

标签: c macros c-preprocessor

我有类似以下内容,我不满意:

#define BEGIN {

#define END_1 };
#define END_2 END_1 };
#define END_3 END_2 };
// ... (possibly more of these) ...

#define END(x) END_ ## x

int main()
{
    BEGIN
    BEGIN
    BEGIN
    END(3) // <- I don't want to pass the 3 here

    BEGIN
    BEGIN
    END(2) // <- I don't want to pass the 2 here
}

我想重写BEGIN和/或END的定义,以便后者不需要参与。

我认为这不可能做到,但我对 C 预处理器不是很熟悉。是否至少有任何方法可以比我发布的示例更接近我的目标?

3 个答案:

答案 0 :(得分:7)

GCC和MSVC提供非标准__COUNTER__宏,每次使用时都会递增。但是,没有办法重置它。

无论你在尝试什么,都应该以另一种方式完成。

答案 1 :(得分:3)

以下可能有所帮助: 它使用#include而不是直接宏...

begin.h:

#if !defined(BEGIN_COUNT)
# define BEGIN_COUNT 1
#elif BEGIN_COUNT == 1
# undef BEGIN_COUNT
# define BEGIN_COUNT 2
#elif BEGIN_COUNT == 2
# undef BEGIN_COUNT
# define BEGIN_COUNT 3
// And so on
#else
# error "Hard coded limit reached for BEGIN_COUNT"
#endif

// The token to add:
{

end.h:

#if !defined(BEGIN_COUNT)
# error "unbalanced #include begin.h/end.h"
#elif BEGIN_COUNT == 1
// The token to add:
}
#elif BEGIN_COUNT == 2
// The tokens to add:
} }
#elif BEGIN_COUNT == 3
// The tokens to add:
} } }
#else
# error "Hard coded limit reached for BEGIN_COUNT"
#endif

// reset counter
# undef BEGIN_COUNT

然后以这种方式使用它:

int main()
{
    #include "begin.h"
    #include "begin.h"

    #include "end.h" // close the 2 'begin'

    #include "begin.h"
    #include "end.h" // close the last 'begin'
    return 0;
}

答案 2 :(得分:-4)

不,没有。