How to get printf style compile-time warnings or errors(如何获取 printf 风格的编译时警告或错误)
问题描述
我想编写一个类似 printf 的例程,但不是在功能方面,而是我希望该例程与 printf 具有相同的编译检查特性.
I would like to write a routine like printf, not functionally-wise, but rather I'd like the routine to have the same time compile check characteristics as printf.
例如,如果我有:
{
int i;
std::string s;
printf("%d %d",i);
printf("%d",s.c_str());
}
编译器会这样抱怨:
1 cc1plus: warnings being treated as errors
2 In function 'int main()':
3 Line 8: warning: too few arguments for format
4 Line 9: warning: format '%d' expects type 'int', but argument 2 has type 'const char*'
代码示例
printf 和 co 是编译器区别对待的特殊函数,还是有一些技巧可以让它在任何用户定义的函数上工作?我感兴趣的具体编译器是 gcc 和 msvc
Are printf and co special functions that the compiler treats differently or is there some trick to getting this to work on any user defined function? The specific compilers I'm interested in are gcc and msvc
推荐答案
不同的编译器可能会以不同的方式实现此功能.在 GCC 中,它是通过带有 format
属性的 __attribute__
说明符实现的(阅读它 这里).编译器执行检查的原因只是在 GCC 提供的标准头文件中,printf
函数是用 __attribute__((format(printf, 1, 2)))代码>
Different compilers might implement this functionality differently. In GCC it is implemented through __attribute__
specifier with format
attribute (read about it here). The reason why the compiler performs the checking is just that in the standard header files supplied with GCC the printf
function is declared with __attribute__((format(printf, 1, 2)))
以完全相同的方式,您可以使用 format
属性将相同的格式检查功能扩展到您自己的可变参数函数,这些函数使用与 printf
相同的格式说明符.
In exactly the same way you can use format
attribute to extend the same format-checking functionality to your own variadic functions that use the same format specifiers as printf
.
只有当您使用的参数传递约定和格式说明符与标准 printf
和 scanf
函数使用的相同时,这一切才会起作用.检查被硬编码到编译器中.如果您对可变参数传递使用不同的约定,编译器将不会帮助您检查它.
This all will only work if the parameter passing convention and the format specifiers you use are the same as the ones used by the standard printf
and scanf
functions. The checks are hardcoded into the compiler. If you are using a different convention for variadic argument passing, the compiler will not help you to check it.
这篇关于如何获取 printf 风格的编译时警告或错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何获取 printf 风格的编译时警告或错误
基础教程推荐
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07