URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3292
[ Назад ]

Исходное сообщение
"Перенесение кода с Visual C++ на g++"

Отправлено rarelangua.fm , 17-Авг-04 23:57 
Всем привет,

Я пишу cross-платформенное (консольное) приложение и столкнулся со следующей проблемой, мой код идеально компилируется в Visual C++ но g++ мне выдает ошибку (вернее их куча, но они идентичные нижеприведенной)
Никаких проблем с непереносимыми функциями у меня нет (все идеально совместимо как с Windows так и с UNIX), но есть куча условностей и разностей в синтаксисе казалось бы стандартизированного С++

Код у меня примерно следующий (он довольно комплексный но пример исчерпывающий)

#define TRY try{
#define CATCH(X) }catch(...){errorstr+="called in - ";errorstr+=X+string(" ");throw;}
#define BEGINSTAT clock_t beginstattime=::clock();
#define ENDSTAT(X) {unsigned int commontime=::clock()-beginstattime;PowerLog(ARGV_PATH_CGI+"performance.log",X##" execution time",commontime,10,true);}

...(далее еще куча всего)

unsigned int DBManagerObject::GetNewMessageId()
{
    TRY
        #ifdef PERFORMANCE_STAT
            BEGINSTAT
        #endif

        unsigned int id;
        FILE* file=fopen(MESSAGESTABLE.c_str(),"r+b");
        fread(&id,sizeof(unsigned int),1,file);
        fclose(file);
        
        #ifdef PERFORMANCE_STAT
            ENDSTAT("GetNewMessageId")
        #endif
        return ++id;
    CATCH("GetNewMessageId")
}

Подскажите мне пожалуйста что хочет сказать g++ выдавая следующую ошибку,-

db.cpp:139:54: pasting ""DBManagerObject::GetNewMessageId"" and "" execution time"" does not give a valid preprocessing token

Я так понимаю вся проблема в макросе:
define ENDSTAT(X) {unsigned int commontime=::clock()-beginstattime;PowerLog(ARGV_PATH_CGI+"performance.log",X##" execution time",commontime,10,true);}
(где PowerLog просто созданный мною класс, но это неважно)

Заранее огромное спасибо за любую помощь


Содержание

Сообщения в этом обсуждении
"Перенесение кода с Visual C++ на g++"
Отправлено Soldier , 18-Авг-04 08:17 
>Я так понимаю вся проблема в макросе:
>define ENDSTAT(X) {unsigned int commontime=::clock()-beginstattime;PowerLog(ARGV_PATH_CGI+"performance.log",X##" execution time",commontime,10,true);}
>(где PowerLog просто созданный мною класс, но это неважно)
>


На основе вашего кода, я набросал тестовую прогу - все нормально
откомпилилось (gcc-2.95):

//------- atest.cpp --------
#include <time.h>
#include <stdio.h>
#include <string>

string errorstr;
string ARGV_PATH_CGI = "/tmp/";

#define PERFORMANCE_STAT

#define TRY try{
#define CATCH(X) }catch(...){errorstr+="called in - ";errorstr+=X+string(" ");throw;}
#define BEGINSTAT time_t beginstattime=time(NULL);
#define ENDSTAT(X) {unsigned int commontime=time(NULL)-beginstattime;PowerLog(ARGV_PATH_CGI+"performance.log",X##" execution time",commontime,10,true);}

class PowerLog {
public:
PowerLog(string s1, char *s2, int c, int c2, bool c3) {
   cout << s1 << s2 << c << c2 << c3 << '\n';
}
};


class DBManagerObject {
public:
  DBManagerObject() {;}
unsigned int GetNewMessageId();
};

unsigned int DBManagerObject::GetNewMessageId()
{

TRY
#ifdef PERFORMANCE_STAT
BEGINSTAT
#endif

unsigned int id;
id=100;
#ifdef PERFORMANCE_STAT
ENDSTAT("GetNewMessageId")
#endif
return ++id;
CATCH("GetNewMessageId");
}

main() {
DBManagerObject dbmo;
cout << "id=" <<  dbmo.GetNewMessageId() << '\n';
}
// ------------------