【问题标题】:Too many warnings on a C macroC 宏上的警告过多
【发布时间】: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)

【问题讨论】:

  • 请问这些警告是什么?
  • 我试图将它们发布在这里,但我无法格式化它们......我不知道如何将它们粘贴到清晰的状态。是否有一些标签可以发布原始数据?
  • 您可以使用 &lt;pre&gt;&lt;/pre&gt; 来处理这种文本。
  • 现在成功了! =] 谢谢!
  • 在不相关的说明中,您不需要像 C++ 语句那样终止预处理器语句,也不需要结尾的分号。

标签: c gcc macros warnings


【解决方案1】:

我发现了

#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, ##__VA_ARGS__)

#define MPL_ERROR_MESSAGE(fmt, ...) MPL_ERROR_MESSAGE2(stderr, fmt, __VA_ARGS__)

不带参数使用时,如

MPL_ERROR_MESSAGE("Just a message! Hi!");

第一个导致

MPL_ERROR_MESSAGE2(stderr, "Just a message! Hi!", __VA_ARGS__)

第二个导致

MPL_ERROR_MESSAGE2(stderr, "Just a message! Hi!", __VA_ARGS__, )

这是错误的。大错特错。只是不要编译,因为 MPL_ERROR_MESSAGE2 没想到最后一个逗号。你知道为什么会这样吗?我应该发布一个新问题吗?

【讨论】:

    【解决方案2】:

    关于您编辑中列出的警告:

    unknown conversion type character ‘,’ in format 
    

    这个

    ... "Invalid Position at (%l, %l, %l)", ...
    

    应该是

    ... "Invalid Position at (%ld, %ld, %ld)", ...
    

    你传递long signed intsigned int转换说明符d。传递long 时,在其前面加上长度修饰符 l


    而且,虽然不相关,但请从 marcos 中删除尾随的 ;

    【讨论】:

    • @MarceloSilva:这不会再发生在你身上,请确保...... ;-)
    • 我需要更多的利他林... =/ 无论如何,我很高兴有人能指出我的愚蠢。 =P 我头疼了 3 天……但看不到这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多