2013-10-07 2 views
1

getopt()과 함께 함수를 작성하여 명령 줄에서 옵션을 가져옵니다. 나는 그것을 컴파일하면,이 경고를 얻을 :C 호환되지 않는 포인터 유형에서 'getopt'인수 2를 전달하는 경고 경고

여기
cc1: warnings being treated as errors 
csim.c: In function ‘getArg’: 
csim.c:157: error: passing argument 2 of ‘getopt’ from incompatible 
pointer type /usr/include/getopt.h:152: note: expected ‘char * const*’ 
but argument is of type ‘const char **’ 

는 C 코드 :

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main(){ 
} 

int getArg(int argc, char const *argv[], int *verbose, int *ps, 
    int *pE, int *pb, char *traceFileName){ 
    int arg; 
    int argCount; 
    while ((arg = getopt(argc, argv, "vs:E:b:t:")) != -1){ 
     switch (arg){ 
      case 'v': 
      *verbose = 1; 
      break; 

      default: 
      printf("%s\n", "Illegal command arguments, please input again"); 
      exit(-1); 
      break; 
     } 
    } 

    if(argCount < 4){ 
     printf("%s\n", "Illegal command arguments, please input again"); 
      exit(-1); 
    } 
    return 0; 
} 

답변

2

오류 메시지에 const char **이 전달되는데 문제가있는 곳은 char * const*입니다. 특히 getopt에 argv (유형이 잘못됨)을 전달 중입니다. argv의 유형을 변경하여이 문제를 해결할 수 있습니다.

int getArg(int argc, char * const argv[], int *verbose, int *ps, int *pE, int *pb, char *traceFileName) 
+0

감사합니다. davmac! 일부 코드에서는 main() 함수가 main (int argc, char ** argv)과 비슷하다는 것을 알 수 있습니다. char * const argv [], char const * argv [] 및 char ** argv와의 차이점은 무엇입니까? – violethaze

+0

'char * const argv []'는'char *'값의 수정 불가능한 배열입니다. 이것은 포인터 (특히'char * const *', 즉 변경 불가능한'char *'값에 대한 포인터)로 변환 될 수 있습니다. 'char const argv []'는 char 값의 변경 불가능한 배열입니다. 'char ** argv'는 포인터를 가리키는 포인터입니다. 'char *'의 배열로서 취급 할 수가 있습니다. – davmac

0

그것은 함수가 ARGV를 선언 한 방법입니다. 너는 constness를 바꿨다. 오류 메시지가 무엇이 잘못되었는지를 알려줍니다.

관련 문제