我有类似以下内容,我不满意:
#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 预处理器不是很熟悉。是否至少有任何方法可以比我发布的示例更接近我的目标?
答案 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)
不,没有。