gpt4 book ai didi

c - 指针的运行时类型检查

转载 作者:太空狗 更新时间:2023-10-29 15:30:00 24 4
gpt4 key购买 nike

我想知道scanf函数是如何实现的。 (当然只是为了好玩)参数的数量是可变的,所以它肯定是由 va_list 实现的, va_arg宏。

当参数数量与格式字符串不匹配时,它也会抛出一些警告。这可以通过解析格式字符串并将其与参数数量进行比较来完成。没有魔法。

我唯一看不到如何实现的是类型检查。当参数类型(指向数据的指针)与格式文字中的相应声明不匹配时,scanf产生警告。如何检查指针指向的数据类型?

例子:

#include<stdio.h>
int main()
{
char buffer1[32], buffer2[32];
int n;
double x;
scanf("%s %s %d",buffer1, buffer2, &x); // warning
scanf("%s %s %d",buffer1, buffer2, &n); // ok
}

输出:

warning: format ‘%d’ expects argument of type ‘int *’,
but argument 4 has type ‘double *’ [-Wformat]

据我所知,C 库不是 C 语言/编译器的一部分,因此 <stdio.h> 中没有与语言相关的内容.我假设警告是由 scanf 的实现产生的,而不是编译器 [?]。 (也许使用 #warning )

如果我想在某些代码中做类似的事情,我怎么知道指针指向哪种数据类型?

注意:我已经下载了 GNU C 库的源代码并查看了 scanf.c .我找不到通过非常复杂的代码的方法。有很多 #ifndef s 和调用具有奇怪名称和结构的其他函数...

最佳答案

此检查由 gcc 编译器处理,专门用于 scanf/printf 函数。

这是一个非常常见的错误,值得为这些函数向编译器添加特殊情况代码。

在这里查看 GCC -WFormat 标志:http://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/Warning-Options.html

-Wformat : Check calls to printf and scanf, etc., to make sure that the arguments supplied have types appropriate to the format string specified, and that the conversions specified in the format string make sense. This includes standard functions, and others specified by format attributes (see Function Attributes), in the printf, scanf, strftime and strfmon (an X/Open extension, not in the C standard) families.

并非所有编译器都执行这些检查,因此它肯定不是什么值得依赖的东西。

通过 GCC,您可以使用 Function Attributes 'format' 和 'format-arg' 告诉编译器对您的函数应用相同的检查。

format (archetype, string-index, first-to-check) The format attribute specifies that a function takes printf, scanf, strftime or strfmon style arguments which should be type-checked against a format string. For example, the declaration:

extern int my_printf (void *my_object, const char *my_format, ...)  
__attribute__ ((format (printf, 2, 3)));

...causes the compiler to check the arguments in calls to my_printf for consistency with the printf style format string argument my_format.

关于c - 指针的运行时类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com