- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__)
void foo(PCSTR fmt, ...)
{
// some other codes
if(condition1)
{
va_list marker;
va_start(maker, fmt);
// Do something.
va_end(marker);
}
if(somecondition)
boo(fmt, /* I want to put the foo's va_arguments here */);
}
在我的项目中有很多代码调用了foo函数。
我今天做了一个新的宏指令。我想在 foo 函数中调用宏。
我该怎么做?
编辑:
当然,我们可以通过调用一些函数(不是宏)来解决这个问题,比如StringCbVPrintf。
但我正在寻找调用宏的方法。
最佳答案
问题没有得到正确解释。这个答案并没有回答提问者心里想的问题,但是确实回答了好像要问的问题。意图与现实之间存在差距。
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__) // semi-colon removed!
void foo(PCSTR fmt, ...)
{
// some other codes
// I want to call boo with VarArgs.
if (somecondition)
boo(fmt, arg1, arg2);
if (anothercondition)
boo("%x %y %z", e1, e2, e3);
if (yetanothercondition)
boo("&T99 P37 T22 9%X ZZQ", x1, y2, z3, a4, b9, c7, q99);
}
抛开所有的玩笑不谈,您可以使用完成工作所需的参数调用函数或宏。由于您未指定格式应采用何种格式,因此我编写了适合自己的格式字符串 - 它们可能不是很有用,但谁知道呢。
无论如何,关键是您可以使用不同的参数列表调用 boo()
宏,这些参数将被传送到 SomethingToDo()
。
鉴于评论中的说明,那么:
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__)
void foo(PCSTR fmt, ...)
{
va_list args;
// I want to call boo with VarArgs.
if (somecondition)
{
va_start(args, fmt);
boo(fmt, args);
va_end(args);
}
}
但是,要使其正常工作,底层函数需要知道如何处理 va_list
。这意味着您通常会得到以下代码,其结构类似于以下内容:
void vSomethingToDo(const char *fmt, va_list args)
{
...code using vfprintf() or whatever...
}
void SomethingToDo(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vSomethingToDo(fmt, args);
va_end(args);
}
#define vboo(fmt, args) vSomethingToDo(fmt, args)
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__)
void foo(PCSTR fmt, ...)
{
...other code...
if (somecondition)
{
va_list args;
va_start(args, fmt);
vboo(fmt, args);
va_end(args);
}
}
这是使用可变参数的代码的“标准模式”。您可以在标准 C 中看到它:printf()
和 vprintf()
; snprintf()
和 vsnprintf()
; fprintf()
和 vfprintf()
;等等。该函数的一个版本在参数列表中有一个省略号;另一个版本以字母“v”为前缀,并用“va_list”代替省略号。省略号代码被标准化为四或五行 - 或多或少如图所示;它使用 va_start 创建并初始化 va_list,调用 v 函数,并在执行 va_end 后返回结果。
关于c - __cdecl 参数 "..."和 __VA_ARGS__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605717/
这是我正在迁移到 VS2017 的代码库的简化版本。以下代码在 VS2013 和 Intel C++ 编译器 2017 更新 4 中编译,但在 VS2013 中不编译。 #include temp
我想调用一个返回 struct 的函数,这个函数有 __cdecl 调用约定。 __cdecl 调用约定如何返回一个struct? 最佳答案 视情况而定。 没有统一的方法。 简单的函数返回,比如int
我想调用一个返回 struct 的函数,这个函数有 __cdecl 调用约定。 __cdecl 调用约定如何返回一个struct? 最佳答案 视情况而定。 没有统一的方法。 简单的函数返回,比如int
我想在 MPI 中使用 AES 算法。 我用 Visual C++ 编写代码。编译代码时出现此错误: unresolved external symbol "void __cdecl BTM(int,
我的公司向第三方提供了一个 DLL,为他们提供了可用于连接到我们的应用程序的 API 函数。 DLL是用VC9编写的,API函数使用了VC默认的调用约定(__cdecl)。第三方已围绕此接口(inte
显示如何使用 MFC 创建线程的示例代码将线程函数声明为静态函数和 __cdecl。为什么需要后者? Boost 线程不理会这个约定,所以它只是一个时代错误吗? 例如(MFC): static __c
在 Visual Studio 2019 中,我编写了以下测试代码,但结果让我感到困惑。 #include using namespace std; template int call(T x, F
在了解了 __cdecl 后,我对堆栈清理感到困惑。 阅读 __cdecl 将弹出堆栈参数 ( https://msdn.microsoft.com/en-us/library/zkwh89ks.as
__stdcall 和 __cdecl 调用约定规定函数名必须在前面加上下划线: C (__cdecl) The same constraints apply to the 32-bit world
我正在尝试用 C (VS2010) 实现一些简单的功能。应该很容易。但是,我收到了 error LNK2019: unresolved external symbol "1>test01.obj :
在函数声明中使用 _cdecl_ 与 __cdecl(1 个下划线 vs 2 个下划线)有什么不同吗? 我正在使用 Visual Studio 2017 及其附带的标准工具。 最佳答案 __cdecl
只是测试 __cdecl 调用约定。 这是一个 cmake 项目,只有 1 个源文件: #include #define CALL_CONVENTION __cdecl void CALL_CONV
我目前正在使用 WSA 编写一个 tcp/ip 服务器。经过一些故障排除后,我的一个 friend 说我应该使用 bool __cdecl winsock_server ( void ) 而不是 bo
我正在学习C语言,在学习的过程中我发现了一行代码,这对我来说是全新的和陌生的void PullDown(char **, int, void (__cdecl **)(void));我只知道第一个和第
我正在运行 ANTLR 4.2 并使用来自的规范 C 语法: https://github.com/antlr/grammars-v4/tree/master/c 我正在执行以下步骤:(使用 ANTL
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__) void foo(PCSTR fmt, ...) { // some other
我发现了这个: Because the stack is cleaned by the called function, the __stdcall calling convention create
我正在为第三方应用程序编写 DLL。主要软件工程师提到该应用程序使用 __cdecl (/Gd) 调用约定。我需要确保使用它。 另外,第三方提供给我一个C++ DLL骨架,导出函数如下: #ifdef
我听一些人说 __fastcall 比 __cdecl 和 __stdcall 快,因为它把两个参数放在寄存器中,而不是一个其他电话;但是,另一方面,这不是 C 中使用的标准。 我想知道是什么让 __
我今天的面试中有这样一个问题。 #include int main(void) { char *s="123456790"; printf("%c,%c",*(char *)((in
我是一名优秀的程序员,十分优秀!