我在源代码中定义了这个宏
#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。
答案 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,后面是运算符 +或 - ,必须与源
中的空格分隔