在VS2013与VS2017中使用printf函数中的宏

时间:2017-10-12 13:10:52

标签: c++ user-defined-literals

我在源代码中定义了这个宏

#define UINT_08X_FORMAT   "%08X"

我需要在printf中使用上面的内容:

printf("Test - "UINT_08X_FORMAT"", 50);

它在VS2013中编译并正常工作,与VS2017一样,它会抛出以下编译错误。

  

无效的文字后缀'UINT_08X_FORMAT';文字运算符或文字   运算符模板'operator'“找不到UINT32_FORMAT”

如何在printf中使用宏。

  

注意:我不想更改宏定义,因为它可以正常工作   VS2013。我需要一个适用于VS2013和VS20的通用解决方案   VS2017。

1 个答案:

答案 0 :(得分:2)

C ++ 11增加了对用户定义文字(UDL)的支持,这些文字是通过向其他文字添加后缀(在本例中为字符串文字)触发的。您可以通过在宏名称周围添加空格来克服它,以强制较新的C ++编译器将其视为单独的标记而不是UDL后缀:

printf("Test - " UINT_08X_FORMAT "", 50);

请参阅http://en.cppreference.com/w/cpp/language/user_literal中的此说明:

  

自引入用户定义的文字后,使用的代码   格式化固定宽度整数类型的宏常量,没有空格   在前面的字符串文字变为无效之后:   std::printf("%"PRId64"\n",INT64_MIN);必须替换为std::printf("%" PRId64"\n",INT64_MIN);    listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { new AlertDialog.Builder(MainActivity.this) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage("Are You Sure You Want to Delete This Note?!") .setTitle("Attempt to Delete A Note") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { dataModels.remove(position); adapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, "ooooooh No!!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(MainActivity.this, "Good Choice", Toast.LENGTH_SHORT).show(); } }) .show(); } });

     

由于最大的munch,用户定义的整数和浮点文字   结束于p,P,(自C ++ 17)e和E,后面是运算符   +或 - ,必须与源

中的空格分隔