2012-03-05 3 views
0

WARNING: While resolving call to function 'help' arguments were dropped!Почему я получаю это предупреждение при компиляции с optmizations?

Если я скомпилирую с помощью gcc -O3 codice -o out/codice, я получаю это досадное предупреждение. Он заканчивает компиляцию, поэтому мне просто интересно, почему это происходит.

Я нахожусь на mac на льве с установленным xcode 4.3. Компилятор он использует это i686-apple-darwin11-llvm-gcc-4.2

Обратите внимание, что если я переключить -O3 на -O2/-O1/-О, то она продолжает давать такое же предупреждение

код выглядит следующим образом ....

#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). Однако никаких аргументов не было, и никаких аргументов не было прочитано. Один из вариантов оптимизации понял это и выпустил такое предупреждение. Определение справки() в качестве справки (void) устранит проблему.

+0

извините за неясность, благодарю вас за то, что вы хороший переводчик: D Есть ли у меня такой термин, чтобы я мог общаться с Google и читать, почему это так? Благодаря! – DanZimm

+1

C стандарт - хороший источник вдохновения :) –

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