c/c++开发分享-Werror = format:编译器如何知道

我写了这个故意错误的代码

printf("%d %d", 1); 

使用g++-Werror=format编译。

编译器给出了令人印象深刻的警告:

 error: format '%d' expects a matching 'int' argument [-Werror=format] 

据我所知,编译器无法判断代码是错误的,因为格式字符串直到运行时才被解析。

我的问题:编译器是否有一个特殊的function,可以用于printf和类似的libc函数,或者这是我可以用于我自己的函数的一个特性? 字符串文字?

    据我所知,编译器无法判断代码是错误的,因为格式字符串直到运行时才被解析。

    只要格式字符串是字符串文字,就可以在编译时解析它。 如果不是(这通常是一个坏主意),那么你可以从-Wformat-security获得有关它的警告。

    编译器是否有一个特殊的function,可以启动printf和类似的libc函数?

    是。

    或者这是我可以用于我自己的function的function?

    是的,只要您使用与printf相同的格式字符串样式(或各种其他标准函数,如scanfstrftime )。

     void my_printf(Something, char const * format, SomethingElse, ...) __attribute__ ((format (printf,2,4))); 

    指示第二个参数是printf样式的格式字符串,格式化的值以第四个开头。 请参阅http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html 。

    好吧, printf肯定会在运行时解析格式字符串以完成它的工作。 但是,如果它想要,编译器可能不会选择自己解析它。

    -Wformat的文档说这正是发生的事情:

    -Wformat

    -Wformat=n

    检查对printfscanf等的调用,以确保提供的参数具有适合指定格式字符串的>类型,并且格式字符串中指定的转换是有意义的。 这包括标准函数,以及由printfscanfstrftimestrfmon (X / Open扩展,而不是C标准)系列(或其他特定于目标的系列)中的格式属性(请参阅函数属性)指定的其他函数。 在没有指定格式属性的情况下检查哪些函数取决于所选的标准版本,并且通过-ffreestanding-fno-builtin禁用没有指定属性的函数的这种检查。

    根据GNU libc 2.2版支持的格式function检查格式。 这些包括所有ISO C90和C99function,以及单Unix规范和一些BSD和GNU扩展的function。 其他库实现可能不支持所有这些function; GCC不支持警告超出特定库限制的function。 但是,如果-Wpedantic与-Wformat一起使用,则会给出关于不在所选标准版本中的格式function的警告(但不是针对strfmon格式的警告,因为这些格式不在C标准的任何版本中)。 请参阅选项控制C方言。

    更新:原来你可以在你自己的function上使用它。 迈克有详细信息 。

      以上就是c/c++开发分享-Werror = format:编译器如何知道相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545880.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注