Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载宏_C++_Visual Studio 2010_Macros_C Preprocessor_Variadic Macros - Fatal编程技术网

C++ 重载宏

C++ 重载宏,c++,visual-studio-2010,macros,c-preprocessor,variadic-macros,C++,Visual Studio 2010,Macros,C Preprocessor,Variadic Macros,我试图通过参数的数量重载宏。 当然我不能让宏过载 我已经尝试使用可变宏来选择正确的宏(如果\uu VA\u ARGS\uuu不存在,则应该删除它之前的最后一个coma-): 这个想法是,如果\uu VA\u ARGS\uu存在,它应该将4个参数传递给选择器,其中第三个参数应该与未使用的参数一起“消失”。所以选择TEST1 如果没有参数,\uu VA\u ARGS\uu将为空,并且应已移除昏迷,因此将选择并使用TEST2 所以,我想这是行不通的,因为\uu VA\u ARGS\uu可能只有在预处理

我试图通过参数的数量重载宏。
当然我不能让宏过载

我已经尝试使用可变宏来选择正确的宏(如果
\uu VA\u ARGS\uuu
不存在,则应该删除它之前的最后一个coma-):

这个想法是,如果
\uu VA\u ARGS\uu
存在,它应该将4个参数传递给选择器,其中第三个参数应该与未使用的参数一起“消失”。所以选择TEST1

如果没有参数,
\uu VA\u ARGS\uu
将为空,并且应已移除昏迷,因此将选择并使用TEST2

所以,我想这是行不通的,因为
\uu VA\u ARGS\uu
可能只有在预处理阶段结束时,在整个过程已经展开之后才会被删除

那么,我怎么能做这样的事呢?(在vs2010中)

基于:


首先,您链接的页面说明它是一个GCC扩展。如果您使用的是标签所暗示的VisualStudio2010,那么它不起作用并不奇怪

那么您没有正确地使用它:您需要在昏迷和
\uu VA\u ARGS\uuuu
之间使用
。如果我这样做并修复了使两个TESTx宏都打印TEST1的输入错误,我就得到了GCC4.4所期望的行为

#include <stdio.h>

#define TEST1() printf("TEST1\n");
#define TEST2() printf("TEST2\n");

#define CHOOSER(x, y, FUNC,...) FUNC()

#define MANIMACRO(...) CHOOSER(,##__VA_ARGS__,TEST1,TEST2)

int main(void)
{
    MANIMACRO(1);
    MANIMACRO();
}
#包括
#定义TEST1()printf(“TEST1\n”);
#定义TEST2()printf(“TEST2\n”);
#定义选择器(x,y,FUNC,…)FUNC()
#定义MANIMACRO(…)选择器(,##(变量),测试1,测试2)
内部主(空)
{
MANIMACRO(1);
MANIMACRO();
}

此链接有用吗?同样,我对VS2010不提供GCC扩展并不感到惊讶twice@YochaiTimmer,这个答案()建议了一个解决方法。链接中的示例非常有效。更新你的答案,否则我会稍后再做。
#define TEST1(expr)           printf("test1")
#define TEST2(expr, explain)  printf("test2")

#define N_ARGS_IMPL2(_1, _2, count, ...) \
   count
#define N_ARGS_IMPL(args) \
   N_ARGS_IMPL2 args
#define N_ARGS(...) N_ARGS_IMPL((__VA_ARGS__, 2, 1, 0))
 /* Pick the right helper macro to invoke. */
#define CHOOSER2(count) TEST##count
#define CHOOSER1(count) CHOOSER2(count)
#define CHOOSER(count)  CHOOSER1(count)
 /* The actual macro. */
#define TEST_GLUE(x, y) x y
#define TEST(...) \
   TEST_GLUE(CHOOSER(N_ARGS(__VA_ARGS__)), \
               (__VA_ARGS__))

int main() {
  TEST(one); // singleArgumentExpansion(one)
  TEST(two, "foopy"); // twoArgumentExpansion(two, "foopy")
  return 0;
}
#include <stdio.h>

#define TEST1() printf("TEST1\n");
#define TEST2() printf("TEST2\n");

#define CHOOSER(x, y, FUNC,...) FUNC()

#define MANIMACRO(...) CHOOSER(,##__VA_ARGS__,TEST1,TEST2)

int main(void)
{
    MANIMACRO(1);
    MANIMACRO();
}