【发布时间】:2015-07-27 08:50:57
【问题描述】:
我正在尝试一种方法来标记我的代码上的警告,但我犯了一些错误并且无法理解在哪里。我的编译器给了我太多关于每次使用这个宏的警告:
#define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n"), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__);
#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__);
使用示例:
MPL_ERROR_MESSAGE("Test %d", 2);
在 ../trunk/mpl_position.h:5:0 包含的文件中,
来自../trunk/mpl_baseenvironment.h:6,
来自../trunk/mpl_baseenvironment.cpp:1:
../trunk/mpl_baseenvironment.cpp:在成员函数‘int MPL_BaseEnvironment::getEnemyRobotAt(MPL_Position&, int)’中:
../trunk/mpl_utils.h:7:167:警告:格式参数过多 [-Wformat-extra-args]
#define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息
^
../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中
#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__);
^
../trunk/mpl_baseenvironment.cpp:28:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中
MPL_ERROR_MESSAGE("(无效值)不在 [0,%d)", i_ER, qlMPLP_enemyRobot__.size());
^
../trunk/mpl_baseenvironment.cpp:在成员函数‘int MPL_BaseEnvironment::deleteEnemyRobotAt(int)’中:
../trunk/mpl_utils.h:7:167:警告:格式参数过多 [-Wformat-extra-args]
#define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息
^
../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中
#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__);
^
../trunk/mpl_baseenvironment.cpp:45:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中
MPL_ERROR_MESSAGE("(无效值)不在 [0,%d)", i_ER, qlMPLP_enemyRobot__.size());
^
../trunk/mpl_baseenvironment.cpp:在成员函数‘int MPL_BaseEnvironment::getMovableObstacleAt(MPL_Position&, int)’中:
../trunk/mpl_utils.h:7:167:警告:格式参数过多 [-Wformat-extra-args]
#define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息
^
../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中
#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__
编辑:更新的警告列表
../trunk/mpl_gridenvironment.h:在成员函数“long int MPL_GridEnvironment::arrayIndex(MPL_Position&)”中: ../trunk/mpl_utils.h:7:167:警告:未知转换类型字符“,”格式为 [-Wformat=] #define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息 ^ ../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中 #define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__); ^ ../trunk/mpl_gridenvironment.h:253:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中 MPL_ERROR_MESSAGE("无效位置 (%l, %l, %l)", x, y, z); ^ ../trunk/mpl_utils.h:7:167:警告:未知转换类型字符“,”格式为 [-Wformat=] #define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息 ^ ../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中 #define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__); ^ ../trunk/mpl_gridenvironment.h:253:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中 MPL_ERROR_MESSAGE("无效位置 (%l, %l, %l)", x, y, z); ^ ../trunk/mpl_utils.h:7:167:警告:未知转换类型字符‘)’,格式为 [-Wformat=] #define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息 ^ ../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中 #define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__); ^ ../trunk/mpl_gridenvironment.h:253:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中 MPL_ERROR_MESSAGE("无效位置 (%l, %l, %l)", x, y, z); ^ ../trunk/mpl_utils.h:7:167:警告:格式参数过多 [-Wformat-extra-args] #define MPL_ERROR_MESSAGE2(output, fmt, ...) fprintf(output, ("\n[ERROR][%s:%d( %s )]\n--- " fmt " ---\n\n" ), __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__); //错误信息 ^ ../trunk/mpl_utils.h:9:37:注意:在宏“MPL_ERROR_MESSAGE2”的扩展中 #define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__); ^ ../trunk/mpl_gridenvironment.h:253:9:注意:在宏“MPL_ERROR_MESSAGE”的扩展中 MPL_ERROR_MESSAGE("无效位置 (%l, %l, %l)", x, y, z);编辑 2:根据要求,触发警告的地方之一:
inline long arrayIndex(MPL_Position& sMPLP_p)
{
long x, y, z;
x = MPL_ROUND_INT((d_delta*sMPLP_p.getX())/d_sizeX__);
y = MPL_ROUND_INT((d_delta*sMPLP_p.getY())/d_sizeY__);
z = MPL_ROUND_INT((d_delta*sMPLP_p.getZ())/d_sizeZ__);
if( (x>=0) && (x<n_sizeX__) && (y>=0) && (y<n_sizeY__) && (z>=0) && (z<n_sizeZ__) ){ //isValidPosition(...)
return( (x*n_sizeY__ + y)*n_sizeZ__ + z );
}
MPL_ERROR_MESSAGE("Invalid Position at (%l, %l, %l)", x, y, z);
MPL_GE_InvalidPosition(sMPLP_p);
return( -1 );
}
(n_size?__ 和 d_size?__ 是类属性;不要费心去理解... :P)
【问题讨论】:
-
请问这些警告是什么?
-
我试图将它们发布在这里,但我无法格式化它们......我不知道如何将它们粘贴到清晰的状态。是否有一些标签可以发布原始数据?
-
您可以使用
<pre>和</pre>来处理这种文本。 -
现在成功了! =] 谢谢!
-
在不相关的说明中,您不需要像 C++ 语句那样终止预处理器语句,也不需要结尾的分号。