- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 va_start 从省略号中检索我的参数。
这是我的代码:
char str[256];
void nrf_log_flash(bool is_to_save, char * log, ...){
va_list args;
va_start(args, log);
int ret = vsprintf(str, log, args);
if(is_to_save){
sprintf(str, "%s : %s\n", nrf_cal_get_time_string(false), log);
//my_nrf_log_add(str, strlen(str));
}
NRF_LOG_INFO("%s", log);
NRF_LOG_INFO("%s", str);
NRF_LOG_INFO("%d", ret);
va_end(args);
}
这是我的使命:
nrf_log_flash(true, "button %d pressed, %u, %x, %c", 2, 3658, 0xca, 'a');
但是我的 va_list 是空的。我做错了什么?
最佳答案
行后
int ret = vsprintf(str, log, args);
你的str变量包含格式化的字符串(例如str是“button 2按下,3658,ca,a”。但是,你的下一句会覆盖这个数据。当你调用sprintf时,并用'log覆盖str中的数据' 变量,格式为(“按钮 %d 按下,%u,%x,%c”)
if(is_to_save){
//THIS CODE OVERWRITE YOUR STR BUFFER
sprintf(str, "%s : %s\n", nrf_cal_get_time_string(false), log);
//my_nrf_log_add(str, strlen(str));
}
顺便说一句,建议使用 snprint 和 vsnprintf 以避免缓冲区溢出。由于格式中包含'%s',因此可能会打印出大于256字节的大字符串。
关于c - nRF52840 上 va_start() 的省略号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51874210/
代码工作完美,但 gcc 和 clang 报告 va_start 上存在问题 stackoverflow 要求我再写一些东西,但我真的不知道是什么 =) int Matrix_cool_input (
在带有可变参数的函数中,我们使用函数 va_start() 初始化一个 va_list 类型的对象,'ap' 为: void va_start(va_list ap, parmN); 我不明白 1.什
根据我对 va_arg 宏的了解,它检索参数列表指向的下一个参数。有什么方法可以选择我想要获取的参数的索引,比如数组索引? 例如,我需要执行一个操作,我需要至少调用 3 次 va_arg 宏,但我希望
我正在阅读 The Linux Programming Interface 一文,他们展示了这个函数来处理错误。在手册页( man stdarg )中它说 va_start必须首先调用以初始化 ap供
据说调用 va_start() 之后必须调用 va_end() 因为 va_start()(总是?)扰乱堆栈。 任何人都可以解释一下调用 va_start() 是如何修改堆栈的,以及这种修改如何帮助获
对于下面的代码: void fun(char *msg, int n, int m, ...) { va_list ptr; va_start(ptr, m); // Questio
在开始使用 va_list 之前提前退出带有可变参数的函数是否安全? ? #include int func(const char * format, ...){ if(format ==
我要制作varargs一次释放多个指针的函数,主要是为了清理代码。所以我有: void free_all( ... ) { va_list arguments; /* Initiali
为什么下面的代码不起作用? #include #include // People are missing this in their reponses.... 'fmt' here is pas
我正在使用 Visual Studio 2012 编译此示例代码: #include #include const char * __cdecl foo(const char * format,
在对历史悠久的类进行编辑时,我被架构师的一个特殊习惯所困扰,他将 va_start -> va_end 序列包装在互斥锁中。该添加的更改日志(大约 15 年前制作,此后没有修改)指出这是因为 va_s
出于某种原因,我无法正常工作: void examplefunctionname(string str, ...){ ... va_start(ap, str.c_str()); 我也
编辑:我现在有 #include 它编译 - 但可变参数没有通过。有什么想法吗? 我有这段代码(摘录): void msg(char* message, ...) { va_list args
我想创建一些日志记录,我创建了一个类。但是我在将参数传递给它时遇到了一些问题。 类: namespace debug { class log { private:
我必须在嵌入式应用程序中使用 IAR 编译器(它没有命名空间、异常、多重/虚拟继承、模板有点限制并且仅支持 C++03)。我不能使用参数包,所以我尝试使用可变参数创建成员函数。我知道可变参数通常是不安
这是我的最小示例: #include #include #include void print_strings_and_lengths(int count, ...) { va_list
具有以下 header 的函数: int max(int n, va_list vals) 在函数内部调用: int max_first(int n, ...) 需要一个 va_start(vals,
我想使用 va_start 从省略号中检索我的参数。 这是我的代码: char str[256]; void nrf_log_flash(bool is_to_save, char * log, ..
我很难在 x64 中编译我的程序。虽然我能够修复所有问题并进行编译,但我的程序在日志记录时崩溃了: void TLog::VLogAddFormat(COLORREF colorText, const
我试图在我的项目中使用 va_start 和 va_end 函数,但 eclipse 不想将其解析为函数。 gcc 编译整个项目没有错误... [我的文件.cpp] #include #includ
我是一名优秀的程序员,十分优秀!