gcc报告“;永远不会被执行”;关于线路:while(fgets(线路,最大线路,标准线路)!=NULL)

gcc报告“;永远不会被执行”;关于线路:while(fgets(线路,最大线路,标准线路)!=NULL),c,cygwin,warnings,gcc3,unreachable-code,C,Cygwin,Warnings,Gcc3,Unreachable Code,我正在寻找一个解释,为什么gcc会给我这个警告 我正在使用cygwin上的gcc-3和-Wunreachable code标志进行编译,gcc向我发出以下警告: main.c:223:警告:永远不会执行 这是这一行:while(fgets(line,MAX_line,stdin)!=NULL){ 此代码位于if(exp){}块中,其中exp是根据命令行参数动态设置的(由getopt()解析),请查看代码部分: if(mystruct.hastab) { 默认值为0。但如果将-t标志传递给应用

我正在寻找一个解释,为什么
gcc
会给我这个警告

我正在使用
cygwin上的
gcc-3
-Wunreachable code
标志进行编译,gcc向我发出以下警告:

main.c:223:警告:永远不会执行

这是这一行:
while(fgets(line,MAX_line,stdin)!=NULL){

此代码位于
if(exp){}
块中,其中
exp
是根据命令行参数动态设置的(由
getopt()
解析),请查看代码部分:

 if(mystruct.hastab) {
默认值为
0
。但如果将
-t
标志传递给应用程序,则默认值将变为
1
,如下所示:

struct mystruct_t {
   //... 
   int hastab;
} mystruct;

    int main(int argc, char *argv[])
    {

      int opt;
        memset(&mystruct, 0, sizeof(mystruct));
         while((opt = getopt(argc, argv, optString)) != -1) {
            switch(opt) {
              case 't':
               mystruct.hastab = 1;
               break;
              //....
            }
        }
         proc();
        return 0;
    }

    void 
    proc(void)
    {
      char *buf, *tmpbuf, line[MAX_LINE + 1], *p, *fullfilename;

      if(mystruct.hastab) {

        while(fgets(line, MAX_LINE, stdin) != NULL) {
           //...
        }
      } else {
       //...
      }
    }

因此,执行代码是有原因的。正如所发生的那样。

听起来gcc确信
hastab
从未设置,或者它只是在警告代码之后才设置。看起来gcc肯定是错误的,但因为您只给了我们一些片段,所以很难确定。我认为除非我们看到com,否则任何人都无法进一步帮助您完成我们可以自己编译的程序。

听起来gcc确信
hastab
从来没有设置过,或者它只是在警告代码之后才设置的。看起来gcc肯定是错误的,但因为你只给了我们一些片段,所以很难确定。我认为除非我们看到一个完整的程序,否则没有人能进一步帮助你请自己填写。

如果我不得不猜测的话,我会说gcc正在考虑有两种情况,您可以调用
proc()
,而不必将
mystruct.hastab
设置为
0
以外的内容

第一种情况是,如果在第一次运行时该值变为
false
,因为您将在不执行
switch
语句的情况下退出循环:

while((opt=getopt(argc,argv,optString))!=-1{

第二种情况是,如果
opt
从不
't'

switch(opt) {
case 't':
    mystruct.hastab = 1;

因此,您将在没有将
mystruct.hastab
设置为非零值的情况下退出循环。

如果我不得不猜测,我会说gcc正在考虑有两种情况,您可以调用
proc()
,而不必将
mystruct.hastab
设置为
0
以外的内容

第一种情况是,如果在第一次运行时该值变为
false
,因为您将在不执行
switch
语句的情况下退出循环:

while((opt=getopt(argc,argv,optString))!=-1{

第二种情况是,如果
opt
从不
't'

switch(opt) {
case 't':
    mystruct.hastab = 1;

因此,您将在没有将
mystruct.hastab
设置为非零值的情况下退出循环。

还有另一种可能性:问题在于宏。下面是一个简单的示例,演示了您的错误:

#include <string.h>
int s;
int main(int argc, char *argv[]) {
  memset(&s, 0, sizeof(s));
}
这个错误并不是特别有启发性。但是,如果运行预处理器,请查看
memset
的扩展:

$ gcc -E tmp.c

...
int s;
int main(int argc, char *argv[]) {
  ((__builtin_object_size (&s, 0) != (size_t) -1) ? __builtin___memset_chk (&s, 0, sizeof(s), __builtin_object_size (&s, 0)) : __inline_memset_chk (&s, 0, sizeof(s)));
}
我怀疑,由于
s
的大小恒定,只有
?:
的一个分支被执行过,这就是gcc所抱怨的。在您的情况下,可能是
fgets
是一个宏。运行
gcc-E
,在输出中找到您的问题行,看看它是否有问题(我的不是,但我不是在运行cygwin)


这个故事的寓意是:预处理器和宏很糟糕。

还有一种可能性:问题在于宏。下面是一个简单的例子来说明您的错误:

#include <string.h>
int s;
int main(int argc, char *argv[]) {
  memset(&s, 0, sizeof(s));
}
这个错误并不是特别有启发性。但是,如果运行预处理器,请查看
memset
的扩展:

$ gcc -E tmp.c

...
int s;
int main(int argc, char *argv[]) {
  ((__builtin_object_size (&s, 0) != (size_t) -1) ? __builtin___memset_chk (&s, 0, sizeof(s), __builtin_object_size (&s, 0)) : __inline_memset_chk (&s, 0, sizeof(s)));
}
我怀疑,由于
s
的大小恒定,只有
?:
的一个分支被执行过,这就是gcc所抱怨的。在您的情况下,可能是
fgets
是一个宏。运行
gcc-E
,在输出中找到您的问题行,看看它是否有问题(我的不是,但我不是在运行cygwin)


这个故事的寓意是:预处理器和宏很糟糕。

gcc很少是错误的。很可能代码片段没有给出完整的故事。@PaulTomblin:我在第一个while循环之前也在main函数中调用:
memset(&mystruct,0,sizeof(mystruct));
if(mystruct.hastab){
在其他函数中被调用,这在main中被调用。
mystruct
是一个全局变量。我之前没有发布,因为我认为这些信息没有用。这是完整的故事。@PaulTomblin:查看更新。我的
main
函数是如何工作的,以及
proc
函数的重要部分。我只删除了stateme块中的nts。将其放入调试器中,查看
mystruct.hastab
proc()的条目中包含的内容
。很可能这不是你所期望的。gcc很少是错的。很可能代码片段没有给出完整的故事。@PaulTomblin:我在第一次while循环之前也在main函数中调用:
memset(&mystruct,0,sizeof(mystruct));
if(mystruct.hastab){
在其他函数中被调用,这在main中被调用。
mystruct
是一个全局变量。我之前没有发布,因为我认为这些信息没有用。这是完整的故事。@PaulTomblin:查看更新。我的
main
函数是如何工作的,以及
proc
函数的重要部分。我只删除了statements在块内。将其放入调试器,查看
mystruct.hastab
proc()
的条目中包含的内容。很可能它不是您所期望的。