- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在做一个项目,我需要模拟一个递归宏(这里是 TEST_COLUMN)。但它在视觉 2013 上失败了。在 gcc 上,它工作正常,但在视觉上,我有一个错误。所以,为了调试这个宏,我使用了 static_assert(也许有更好的方法)。每次,在宏 TEST_COLUMN_X(name, ...) 中,name 的值包含所有参数,而不仅仅是第一个参数。
如果有人有解决这个问题的想法。这是重现它所需的最少代码:
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x) //transform x to char
#define EXPAND(x) x
#define NUM_ARGS_HELPER(X,X64,X63,X62,X61,X60,X59,X58,X57,X56,X55,X54,X53,X52,X51,X50,X49,X48,X47,X46,X45,X44,X43,X42,X41,X40,X39,X38,X37,X36,X35,X34,X33,X32,X31,X30,X29,X28,X27,X26,X25,X24,X23,X22,X21,X20,X19,X18,X17,X16,X15,X14,X13,X12,X11,X10,X9,X8,X7,X6,X5,X4,X3,X2,X1,N,...) N
//count to number of argument containing
#define NUM_ARGS(...) EXPAND(NUM_ARGS_HELPER(0, __VA_ARGS__ ,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)) in __VA_ARGS__
//define each level of the macro
#define TEST_COLUMN_0 ;
#define TEST_COLUMN_1(name) static_assert(false,"TEST_COLUMN_1 " STR(name));
#define TEST_COLUMN_2(name,...) static_assert(false,"TEST_COLUMN_2 " STR(name)); //TEST_COLUMN_1(__VA_ARGS__)
#define TEST_COLUMN_3(name,...) static_assert(false,"TEST_COLUMN_3 " STR(name)); //TEST_COLUMN_2(__VA_ARGS__)
#define TEST_COLUMN_4(name,...) static_assert(false,"TEST_COLUMN_4 " STR(name)); TEST_COLUMN_3(__VA_ARGS__)
//tricks to call the correct macro (TEST_COLUMN_X)
#define TEST_COLUMN_N1(N,...) TEST_COLUMN_##N(__VA_ARGS__)
#define TEST_COLUMN(N,...) TEST_COLUMN_N1(N,__VA_ARGS__)
//recursive macro
#define TEST_STATIC_COLUMN(...) TEST_COLUMN(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)
int main(int argc, char* argv[])
{
TEST_STATIC_COLUMN(a, b, c);
return 0;
}
输出:
main.cpp(21): error C2338: TEST_COLUMN_3 a, b, c
但应该是
main.cpp(21): error C2338: TEST_COLUMN_3 a
您可以使用在线编译器对此进行测试 http://webcompiler.cloudapp.net/
最佳答案
我不知道为什么,但是添加一些对 EXPAND 的调用可以解决这个问题:
#define TEST_COLUMN_2(name,...) static_assert(false,"TEST_COLUMN_2 " STR(name)); EXPAND(TEST_COLUMN_1(__VA_ARGS__))
#define TEST_COLUMN_3(name,...) static_assert(false,"TEST_COLUMN_3 " STR(name)); EXPAND(TEST_COLUMN_2(__VA_ARGS__))
#define TEST_COLUMN_4(name,...) static_assert(false,"TEST_COLUMN_4 " STR(name)); EXPAND(TEST_COLUMN_3(__VA_ARGS__))
#define TEST_COLUMN_N1(N,...) EXPAND(TEST_COLUMN_##N(__VA_ARGS__))
关于c++ - Visual Studio 宏 __VA_ARGS__ 未正确解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36155734/
我有以下两个宏: #define F1(...) [NSString stringWithFormat:__VA_ARGS__] #define F2(format, ...) [NSString s
我想知道##在这个宏定义中做了什么: #define debug(M, ...) fprintf(stderr,M "\n",##__VA_ARGS __) 我在谷歌上搜索了答案,并得出了以下结果。
C++ preprocessor __VA_ARGS__ number of arguments 那里接受的答案对我不起作用。我试过 MSVC++ 10 和 g++ 3.4.5。 我还将示例压缩成更小
此代码片段是否可移植? 定义: #define log(...) std::cout << __FILE__ << "[" << __LINE__ << "]:" \
在可变参数宏中,#__VA_ARGS__是所有参数的逗号分隔字符串(至少我用 gcc 和 clang 得到了这种行为)。有没有一种方法可以在不解析该字符串的情况下为各个参数创建一个字符串数组? 我正在
我有以下宏: #define MY_FCT1( id, ... ) \ FCT( id,__VA_ARGS__ ); \ 我想创建一个新的来做这样的事情: #de
variadic macro提到了 gcc 的 VA_ARGS。 我做了以下实验。 #define EVAL(f,...) eval(f,build_args(args,__VA_ARGS__ , a
我知道我可以做到: #define MACRO(api, ...) \ bool ret = api(123, ##__VA_ARGS__); 这只是一个示例,它是更复杂解决方案的一部分。关键是我
我正在尝试为数组数据冗余编写一个特殊的类型处理。这个想法是在编译时全局定义和声明一个固定大小的数组,但每个声明的数组的大小都不同。这是想法: array[N] = { el1, el2, el3, .
我正在尝试制作一个类似于此的函数: #define printf_copy(s, ...) printf(s, ##__VA_ARGS__) // acceptable! 但这是一个预处理器,我需
如果我尝试编译以下代码: template void Dummy(const TArgs &...args) { } #define DUMMY(...) Dummy("Hello", ##__VA
我想定义一个宏,例如 - #define log(lognumber,...) logreport(lognumber,__VA_ARGS__) 我想检查 __VA_ARGS__ 用户调用 log
假设我们有以下两个函数: void foo1(int p); void foo2(int p, ...); 我想编写一个宏,根据参数的数量自动扩展为正确的宏。我使用了以下肮脏/黑客的方式,但我很好奇是
假设我有一个宏: #define FOO(a, ...) if (a) foo(a, ## __VA_ARGS__) 这很好用: FOO(a)将转换为 if (a) foo(a) FOO(a, )将转
只是为了了解一点背景知识,这不是一个微不足道的练习!我正在使用 Boost.Python,为了避免大量丑陋的样板代码,我使用宏将函数包装在 Python 包装器类中,以选择性地为该方法调用 Pytho
我正在尝试重新定义可变参数宏以使用 cout 而不是 printf。这是原始代码: #define LOGE(...) PRINT_LEVEL(1, __VA_ARGS__); #define P
我正在尝试将 __ VA_ARGS __ 传递给一个函数。由于某种原因,第一个参数总是错误的(看起来像一个地址): #define PRINTF_ERROR(format, ...) {\
我已经从互联网上下载并重新编译了一个库,结果是由于非法指针地址导致核心转储。 查看源码,涉及的语句有: #define E_DEBUG(level, ...) \ if (err_get_de
我正在开发一个嵌入式应用程序,它使用一个库来连接 SPI NAND 内存芯片。提供的库使用打印功能,作为应用程序开发人员,我必须针对我的特定平台覆盖该功能。 例如,他们在代码中广泛使用函数 print
我正在为 SQL 代码使用预处理器宏 va_args hack,以允许直接粘贴到 sqlite3.exe 中以进行快速的非构建调试: #define QUOTE(...) #__VA_ARGS__ c
我是一名优秀的程序员,十分优秀!