2012-03-05 2 views
0

WARNING: While resolving call to function 'help' arguments were dropped!optmization으로 컴파일 할 때이 경고 메시지가 나타나는 이유는 무엇입니까?

gcc -O3 codice -o out/codice을 사용하여 컴파일하면이 성가신 경고 메시지가 표시됩니다. 컴파일이 끝났으므로 왜 이런 일이 일어나는지 궁금합니다.

저는 xcode 4.3이 설치된 사자상의 Mac입니다. 그것을 사용하는 컴파일러는 내가 전환하는 경우 - O2/-O1/-O에 -O3 다음은

코드는 다음과 같다 같은 경고를주고 계속 i686-apple-darwin11-llvm-gcc-4.2

주 ....

입니다
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <signal.h> 
#include <string.h> 
#include <math.h> 

void help(); 

char *codice_encrypt(char *in); 
char *codice_decrypt(char *in); 

void sigint_handler(int signal) { 
    exit(2); 
} 

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

    if (argc != 3) { 
     help(); 
    } 

    signal(SIGINT, sigint_handler); 
    char *ret, *status; 
    int tmpret; 

    if (strcmp(argv[1], "e") == 0 || strcmp(argv[1], "encrypt") == 0) { 
     status = "Encrypting...\n"; 
     tmpret = write(STDOUT_FILENO, status, strlen((const char *)status)); 
     ret = codice_encrypt(argv[2]); 
    } else if (strcmp(argv[1], "d") == 0 || strcmp(argv[1], "decrypt") == 0) { 
     status = "Decrypting...\n"; 
     tmpret = write(STDOUT_FILENO, status, strlen((const char *)status)); 
     ret = codice_decrypt(argv[2]); 
    } else { 
     status = "Could not understand command line arguments O.o\n"; 
     tmpret = write(STDOUT_FILENO, status, strlen((const char *)status)); 
     help(STDOUT_FILENO); 
    } 

    status = "Success!\nRetval:\n\n"; 
    tmpret = write(STDOUT_FILENO, status, strlen((const char *)status)); 
    tmpret = write(STDOUT_FILENO, ret, strlen((const char *)ret)); 
    tmpret = write(STDOUT_FILENO, "\n\n", 2); 

    return 0; 

} 

void help() { 
    int tmpret; 
    const char *logo = "\n\n\t\tooooooo__oo______________________\n" 
       "\t\t_____oo______oo_oo_oo__oo_oo_oo__\n" 
       "\t\t____oo___oo__ooo_oo__o_ooo_oo__o_\n" 
       "\t\t___o_____oo__oo__oo__o_oo__oo__o_\n" 
       "\t\t_oo______oo__oo__oo__o_oo__oo__o_\n" 
       "\t\tooooooo_oooo_oo______o_oo______o_\n" 
       "\t\t_________________________________\n\n\n"; 
    tmpret = write(STDOUT_FILENO, logo, strlen(logo)); 
    const char *help = "Help\n" 
         "Is\n" 
         "Still\n" 
         "Being\n" 
         "Written :)\n\n"; 
    tmpret = write(STDOUT_FILENO, help, strlen(help)); 
    exit(1); 
} 

char *codice_encrypt(char *in) { 
    unsigned int i; 
    char ya = 0x55; 
    write(STDOUT_FILENO, "0x", 2); 
    char itret[50]; 
    sprintf(itret,"%#hhx",ya); 
    write(STDOUT_FILENO, itret, strlen(itret)); 
    write(STDOUT_FILENO, "\n", 1); 
    ya = ya & 0x0F; 
    ya = ya >> 1; 
    sprintf(itret,"%#hhx",ya); 
    write(STDOUT_FILENO, itret, strlen(itret)); 
    write(STDOUT_FILENO, "\n", 1); 
    ya = 0x55; 
    ya = ya & 0xF0; 
    ya = ya << 1; 
    sprintf(itret,"%#hhx",ya); 
    write(STDOUT_FILENO, itret, strlen(itret)); 
    write(STDOUT_FILENO, "\n", 1); 
    return in; 
} 

char *codice_decrypt(char *in) { 
    return in; 
} 

감사!

+0

'STDOUT_FILENO'을 (를) 정의에 인수가없는'help()'에 전달하고 있습니까? – noMAD

+0

그 유형이었던 나는 그 것을 제거했다 – DanZimm

답변

1

여기 help()에는 가변 개수의 인수가 있습니다 (나는 우리가 C 코드에 대해 말하는 것으로 가정합니다). 그러나 인수가 전달되지 않았고 인수가 읽히지 않았습니다. 최적화 패스 중 하나가이를 인식하고 그러한 경고를 발행했습니다. help()를 help (void)로 정의하면 문제가 해결됩니다.

+0

막연한 것에 대해 유감스럽게 생각한다. 좋은 통역사가되어 주셔서 감사합니다 : D 이렇게 말하면서 제가 구글을 할 수 있고 이것을 왜 읽을 수 있을까요? 감사! – DanZimm

+1

C 표준은 영감의 좋은 원천입니다 :) –

관련 문제