警告:不推荐将字符串常量转换为âchar*â

时间:2013-03-26 06:27:45

标签: c++ linux

我在c ++中有一段代码可以正常使用gcc版本4.1.2 20071124但是使用gcc版本4.4.6 20120305发出警告。请建议:

代码:

WriteLog(sgca_log_file,"Exception occured in load_sgsn_cdr_arch \n",true);

警告:deprecated conversion from string constant to 'char*'

其中Writelog是一个在指定日志文件中打印日志的函数:

void WriteLog(const char* fileName, const char* pLogMsg, bool pTimeRequired)
{
    FILE    *lFileDesc = NULL;
    char    lMessage[1000];
    char    lBuffer[1000];
    char    lDate[1000];
    time_t  lRawtime;
    struct  tm * lTimeinfo;
    char    LoaderLogFile[80];
    char loaderHome[30];
    char * pch;
    char szdir[30];

    try
    {
        memset(LoaderLogFile, '\0',80);
        memset(lMessage, '\0', 1000);
        memset(lBuffer, '\0', 1000);
        memset(lDate, '\0', 1000);

        time(&lRawtime);
        lTimeinfo = localtime(&lRawtime);
        strftime(lBuffer, 1000, "| %x - %X | ", lTimeinfo);
        strftime(lDate, 1000, "%Y_%m_%d", lTimeinfo);

        if (!strcmp(fileName,"default"))
        {
            strcpy(loaderHome, getenv("LOADER_HOME"));
            sprintf(LoaderLogFile,"%s/log/Loader_%s.log",loaderHome,lDate);
        }

        else
            sprintf(LoaderLogFile,"%s_%s.log",fileName,lDate);

        if (!file_exists(LoaderLogFile))
        {
            if((pch=strrchr(LoaderLogFile,'/')) != '\0')
            {
                strncpy(szdir,LoaderLogFile,pch-LoaderLogFile+1);
                if(file_exists(szdir))
                {
                    lFileDesc = fopen(LoaderLogFile, "a");
                    fflush(lFileDesc);
                    fclose(lFileDesc);
                }
                else
                {
                    sprintf (lBuffer,"Directory %s doesnot exist. Please check the configurations. Stopping the System. \n",szdir);
                    WriteLog("default",lBuffer,true);
                    StopSystem("default",lBuffer);
                }
            }
            else
            {
                sprintf (lBuffer,"Invalid log file name %s \n",LoaderLogFile);
                WriteLog("default",lBuffer,true);
                StopSystem("default",lBuffer);
            }

        }

        //! Check whether the timestamp also has to be written in the log file
        if(pTimeRequired)
        {
            sprintf(lMessage, "%s%s\n", lBuffer, pLogMsg);
        }
        else
        {
            sprintf(lMessage, "%s\n", pLogMsg);
        }

        //! Open the log file in append mode
        lFileDesc = fopen(LoaderLogFile, "a");
        if(lFileDesc != NULL)
        {
            fprintf(lFileDesc, lMessage);
            fflush(lFileDesc);
            fclose(lFileDesc);
        }
        else
        {
            printf("Unable to open the file \n");
        }



    }
    catch(...)
    {
        printf("Exception occured in WriteLog \n");
    }
}

2 个答案:

答案 0 :(得分:3)

我会宣布

   void WriteLog(const char* fileName, const char* pLogMsg, 
                 bool pTimeRequired);

因为您很可能不会更改fileNamepLogMsg

答案 1 :(得分:1)

这是因为字符串文字是不可修改的。但是为了向后兼容,可以将它们视为char*而不是const char*

通过将您的功能更改为:

来摆脱警告
void WriteLog(char* fileName, const char* pLogMsg, bool pTimeRequired);