关于网友提出的“ GCC 编译 不提示警告或者错误。。。”问题疑问,本网通过在网上对“ GCC 编译 不提示警告或者错误。。。”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: GCC 编译 不提示警告或者错误。。。
描述: #include
#include
#include
int main()
{
int result = open("test.txt", O_WRONLY , O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR);
printf("%d", result);
return 0;
}
这一段代码 我把其中一个|打成了,
但是用gcc -Wall src.c竟然都不提示任何警告 直接编译通过。。。。 在Windows肯定报错
加了-Wmissing-prototypes -Wmissing-declarations还是没任何警告
运行的话是返回-1
这也太恐怖了吧 还好代码少 否则这种问题要查N久N久阿。。。。
解决方案1: 这是因为open函数是可变参数
它的原型 3楼已经给出
至于编译器是如何处理可变参数的
首先函数名关联着内部符号表 有一个proto的指针域 它是用来存放参数的类型的 当遇到可变参数时 它都是按照 翻译为 viod 类型的。而编译器在处理参数类型时是会报错的 很显然 这里不是错误。 而当函数进行调用的 它的实参是依次的 从右至左的 存放在栈中。 这里也不会出错
这就是从编译器内部看 处理一个可变参数的函数 为什么不出错。
解决方案2: $ man 2 open
......
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
又查了一下,linux里面的open确实有可变参数的。
int open(char* path, int access, ...);
这个可变参数大概是为了支持man里面提到的两个参数或者三个参数的两种情况,结果呢,连四个参数也不报错了。
以上介绍了“ GCC 编译 不提示警告或者错误。。。”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2808056.html