首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >printf格式说明符的参数和printf格式说明符的额外参数中的类型无效

printf格式说明符的参数和printf格式说明符的额外参数中的类型无效
EN

Stack Overflow用户
提问于 2020-06-18 01:11:16
回答 2查看 576关注 0票数 1

我一直在Coverity中调试这段RTOS代码,并遇到了一些小错误。这些错误是不言而喻的,因为它们是格式说明符错误。这两个错误都在main函数上。第一个错误在该行上:

代码语言:javascript
复制
RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);

错误: printf格式说明符(PRINTF_ARGS) invalid_type的参数中的类型无效:格式说明符%X的参数结果应为unsigned int类型,但其类型为unsigned long。

第二个错误在行上:

代码语言:javascript
复制
RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);

错误:打印格式说明符(PRINTF_ARGS)状态的额外参数:此参数未由格式extra_argument: status使用。

我不确定如何传递额外的参数,因为RTOS_TEST只接受一个参数。请告诉我我哪里做错了。

代码语言:javascript
复制
#if !defined(__arc__)
   #define RTOS_TEST(...) printf(__VA_ARGS__)
#else
   #define RTOS_TEST(...)
#endif

typedef uint_32  _mqx_uint, _PTR_ _mqx_uint_ptr;
typedef uint32_t Status_t;

void SECTION_CODE("CODE_SLOW") WrappersTest(uint_32  parameter)
{
   _lwmem_pool_id lwmem_pool_id;
   pointer        error_ptr;
   pointer        error2_ptr;
   Status_t       status;
   _mqx_uint      result;
   BOOL           fail = FALSE;

   RTOS_TEST("Start MQX integrity tests ...\n");

   TestQueue();
   TestLightWeightSemaphore();
   TestMutexAPI();
   TestLightWeightEvent();
   TestFastMessageQueue();
   TestLightWeightMemory();

#if defined(MQX_TEST_EVENT_TEST)
   RTOS_TEST("Calling _event_test ..."); fflush(stdout);
   result = _event_test(&error_ptr);

   if (result != MQX_OK)
   {
      RTOS_TEST(" ***FAILED*** _event_test: 0x%08X\n", result);
      fail = TRUE;
   }
   else
   {
      RTOS_TEST("PASSED!\n");
   }
#endif // MQX_TEST_EVENT_TEST

status = RTOS_MutexInit(&testMutex, (uint8_t*)Name);

if (status != STATUS_OK)
{
   RTOS_TEST("MQX init mutex FAILED: 0x%08X\n", status);
}

for (; loopCount > 0; loopCount--)
{
   status = RTOS_MutexLock(&testMutex);

   if (status != STATUS_OK)
   {
      RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
   }
}

int main()
{
   .........,
   RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
   ..........
   if (status != STATUS_OK)
         {
            RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
         }
   ..........
   return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2020-06-18 01:37:51

在此呼叫中

代码语言:javascript
复制
RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);

您至少忘了在格式说明符'X'之前指定符号'%',例如"0x%08X"。因此,编译器会发出一个引用参数status的错误,指出有多余的参数

在此呼叫中

代码语言:javascript
复制
RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);

必须指定长度修饰符'l'

例如

代码语言:javascript
复制
RTOS_TEST(" Error = %#lX, pool = %#lX\n", result, (_mqx_uint)error_ptr);

请注意,不需要编写0x。相反,您可以使用标志'#'。如果您想使用前缀'0x',则使用小写格式说明符'x' like"%#lx". Otherwise use the upper case format specifier'X'like"%#lX"`.

票数 1
EN

Stack Overflow用户

发布于 2020-06-18 03:19:41

"MQX lock mutex FAILED: 0x08X\n", status只是缺少了"%"@Vlad from Moscow也回答了这个问题。

很好,OP启用了许多警告/错误。

关于类型不匹配,请使用匹配的print说明符。

示例:由于status是一个uint32_t,因此使用"%" PRIX32

代码语言:javascript
复制
#include <inttypes.h>

typedef uint32_t Status_t;
Status_t       status;

// RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
RTOS_TEST("MQX lock mutex FAILED: 0x%08" PRIX32 "\n", status);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62434605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档