2013-11-17 3 views
0

Я немного запутался относительно предупреждений компилятора, которые я получаю и как их разрешать. Вот ошибки и соответствующие срезы кода:Confusing Предупреждения компилятора

декларация CMDS (соответствующего большинство из них):

23: static char **cmds[] = { cmd0, cmd1, cmd2, cmd3, cmd4 }; 
24: static int ncmds = sizeof(cmds)/sizeof(cmds[0]); 


pipeline.c: In function âexec_nth_commandâ: 
pipeline.c:41: warning: declaration of âncmdsâ shadows a global declaration 
pipeline.c:24: warning: shadowed declaration is here 
pipeline.c:41: warning: declaration of âcmdsâ shadows a global declaration 
pipeline.c:23: warning: shadowed declaration is here 

41: static void exec_nth_command(int ncmds, char ***cmds) 

pipeline.c: In function âexec_pipe_commandâ: 
pipeline.c:68: warning: declaration of âncmdsâ shadows a global declaration 
pipeline.c:24: warning: shadowed declaration is here 
pipeline.c:68: warning: declaration of âcmdsâ shadows a global declaration 
pipeline.c:23: warning: shadowed declaration is here 

68: static void exec_pipe_command(int ncmds, char ***cmds, Pipe output)  

pipeline.c: In function âexec_pipelineâ: 
pipeline.c:79: warning: declaration of âncmdsâ shadows a global declaration 
pipeline.c:24: warning: shadowed declaration is here 
pipeline.c:79: warning: declaration of âcmdsâ shadows a global declaration 
pipeline.c:23: warning: shadowed declaration is here 

79: static void exec_pipeline(int ncmds, char ***cmds) 

pipeline.c:82: warning: ISO C90 forbids mixed declarations and code 


82: pid_t pid; 

pipeline.c: In function âerr_usageâ: 
pipeline.c:141: warning: declaration of âusestrâ shadows a global declaration 
pipeline.c:26: warning: shadowed declaration is here 

    26: static char const usestr[] = "[-f filename]"; 
141: static void err_usage(char const *usestr) 

ответ

1

Предупреждений говорят ваши местные названия прикрывают другие переменные с тем же именем. Так

pipeline.c:41: warning: declaration of âncmdsâ shadows a global declaration 

параметр ncmds скрыт переменной static char **cmds[] =, что делает параметр недоступен.

Способ решения этих проблем - просто выбрать другое имя для параметра или для переменной. Я бы изменил имя используемого вами менее часто, поэтому вам не нужно менять столько кода. Вы также можете просто игнорировать предупреждение, но причина в том, что, когда вы смотрите на код позже или записываете новые вещи в эту функцию, вы можете случайно ссылаться на один, когда вы имеете в виду другого, поскольку одно и то же имя может сбивать с толку ,

pipeline.c:82: warning: ISO C90 forbids mixed declarations and code 

Это один потому, что в старшем стиле C, объявляя переменную в любом месте, за исключением верхней части объема не допускается. На практике это не проблема, хотя на самом деле, как правило, лучше объявить переменную как можно ближе к точке использования, поэтому я не буду менять код здесь. Вместо этого попробуйте выполнить компиляцию с -std=c99, если вы можете - более новая версия стандарта позволяет это сделать.

+0

Я не понимаю, как две разные именованные переменные разных типов могут скрыть друг друга. –

+1

не параметр скрывает переменную области файла, а не наоборот? – user1338

+0

@MarshallTigerus: поскольку одна глобальная переменная назначает другую локальную. – rodrigo

Смежные вопросы