Gcc 为什么在使用optmization编译时会收到此警告?

Gcc 为什么在使用optmization编译时会收到此警告?,gcc,warnings,llvm,gcc-warning,Gcc,Warnings,Llvm,Gcc Warning,警告:在解析对函数“help”的调用时,参数被丢弃 如果我使用gcc-O3 codice-o out/codice进行编译,我会得到这个讨厌的警告。它完成了编译,所以我只是想知道为什么会发生这种情况 我在安装了xcode 4.3的mac on lion上。它使用的编译器是i686-apple-darwin11-llvm-gcc-4.2 请注意,如果我将-O3切换到-O2/-O1/-O,则它将继续发出相同的警告 代码如下 #include <stdlib.h> #include <

警告:在解析对函数“help”的调用时,参数被丢弃

如果我使用
gcc-O3 codice-o out/codice进行编译,我会得到这个讨厌的警告。它完成了编译,所以我只是想知道为什么会发生这种情况

我在安装了xcode 4.3的mac on lion上。它使用的编译器是
i686-apple-darwin11-llvm-gcc-4.2

请注意,如果我将
-O3
切换到-O2/-O1/-O,则它将继续发出相同的警告

代码如下

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效帮助();
字符*密码加密(字符*输入);
char*codice_解密(char*in);
无效信号处理器(内部信号){
出口(2);
}
int main(int argc,字符**argv){
如果(argc!=3){
帮助();
}
信号(SIGINT,SIGINT_处理器);
字符*ret,*状态;
int tmpret;
如果(strcmp(argv[1],“e”)==0 | | strcmp(argv[1],“encrypt”)==0){
status=“正在加密…\n”;
tmpret=write(STDOUT_文件号,状态,strlen((const char*)状态));
ret=密码加密(argv[2]);
}else if(strcmp(argv[1],“d”)==0 | | strcmp(argv[1],“decrypt”)==0){
status=“正在解密…\n”;
tmpret=write(STDOUT_文件号,状态,strlen((const char*)状态));
ret=codice_decrypt(argv[2]);
}否则{
status=“无法理解命令行参数O.O\n”;
tmpret=write(STDOUT_文件号,状态,strlen((const char*)状态));
帮助(标准文件号);
}
status=“Success!\nRetval:\n\n”;
tmpret=write(STDOUT_文件号,状态,strlen((const char*)状态));
tmpret=write(STDOUT_FILENO,ret,strlen((const char*)ret));
tmpret=write(标准输出文件号“\n\n”,2);
返回0;
}
无效帮助(){
int tmpret;
const char*logo=“\n\n\t\tooooooooooo\uoooooo\uoooo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uoo\uuoo\uoo\uuoo\uu
“\t\t\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“\t\t\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\n”
“\t\t\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\n”
“\t\t\u oo\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“\t\toooooooooooooooooooo\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
“\t\t\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\n\n”;
tmpret=write(标准文件号、标志、标准格式(标志));
const char*help=“help\n”
“是\n”
“仍然\n”
“正在\n”
“书面:)\n\n”;
tmpret=write(STDOUT_FILENO,help,strlen(help));
出口(1);
}
字符*密码加密(字符*输入){
无符号整数i;
char ya=0x55;
写入(标准输出文件号,“0x”,2);
char-itret[50];
sprintf(itret,“%#hhx”,ya);
写入(STDOUT_文件号、itret、strlen(itret));
写入(标准输出文件号,“\n”,1);
ya=ya&0x0F;
ya=ya>>1;
sprintf(itret,“%#hhx”,ya);
写入(STDOUT_文件号、itret、strlen(itret));
写入(标准输出文件号,“\n”,1);
ya=0x55;
ya=ya&0xF0;

ya=ya此处help()的参数数量可变(我假设我们讨论的是C代码)。但是,没有传递任何参数,也没有读取任何参数。其中一个优化过程意识到了这一点,并发出了这样的警告。将help()定义为help(void)将解决此问题。

您正在将
STDOUT\u FILENO
传递给
help()
它的定义中没有参数吗?那只是一种类型,我删除了它。很抱歉说得含糊不清,谢谢你是一个好的解释器:D有没有一个术语,让我可以在谷歌上搜索一下,看看为什么会是这样?谢谢!