菜鸟总是每天都有问题,今天我再问一个,关于特定宏的

无中生桃 2015-01-14 11:16:53
刚刚了解了一些C/C++中有一些特等的宏,如__FILE__、__LINE__、__DATE__、__TIME__、__FUNC__、__FUNCTION__,他们有什么使用限制吗?如果我用他们写个输出日志的通用函数,会不会有神马问题?
...全文
109 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
输出日志推荐本ID原创MyLog:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
    #include <io.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
    #include <pthread.h>
    #define  CRITICAL_SECTION   pthread_mutex_t
    #define  _vsnprintf         vsnprintf
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
    struct tm *now;
    struct timeb tb;

    if (NULL==pszFmt||0==pszFmt[0]) return;
    _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
    ftime(&tb);
    now=localtime(&tb.time);
    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );
    sprintf(mss,"%03d",tb.millitm);
    printf("%s %s.%s %s",datestr,timestr,mss,logstr);
    flog=fopen(logfilename1,"a");
    if (NULL!=flog) {
        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
        if (ftell(flog)>MAXLOGSIZE) {
            fclose(flog);
            if (rename(logfilename1,logfilename2)) {
                remove(logfilename2);
                rename(logfilename1,logfilename2);
            }
        } else {
            fclose(flog);
        }
    }
}
void Log(const char *pszFmt,...) {
    va_list argp;

    Lock(&cs_log);
    va_start(argp,pszFmt);
    LogV(pszFmt,argp);
    va_end(argp);
    Unlock(&cs_log);
}
//Log}
int main(int argc,char * argv[]) {
    int i;
#ifdef WIN32
    InitializeCriticalSection(&cs_log);
#else
    pthread_mutex_init(&cs_log,NULL);
#endif
    for (i=0;i<10000;i++) {
        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
    }
#ifdef WIN32
    DeleteCriticalSection(&cs_log);
#else
    pthread_mutex_destroy(&cs_log);
#endif
    return 0;
}
//1-78行添加到你带main的.c或.cpp的那个文件的最前面
//81-85行添加到你的main函数开头
//89-93行添加到你的main函数结束前
//在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中
赵4老师 2015-01-14
  • 打赏
  • 举报
回复
查MSDN是Windows程序员必须掌握的技能之一。 Predefined Macros The compiler recognizes six predefined ANSI C macros (see Table 1.1), and the Microsoft C++ implementation provides several more (see Table 1.2). These macros take no arguments and cannot be redefined. Their value (except for __LINE__ and __FILE__) must be constant throughout compilation. Some of the predefined macros listed below are defined with multiple values. Their values can be set by selecting the corresponding menu option in the Visual C++ development environment, or by using a command-line switch. See the tables below for more information. Table 1.1 ANSI Predefined Macros Macro Description __DATE__ The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H. __FILE__ The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks. __LINE__ The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. __STDC__ Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined. __TIME__ The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss. __TIMESTAMP__ The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31. Table 1.2 Microsoft-Specific Predefined Macros Macro Description _CHAR_UNSIGNED Default char type is unsigned. Defined when /J is specified. __cplusplus Defined for C++ programs only. _CPPRTTI Defined for code compiled with /GR (Enable Run-Time Type Information). _CPPUNWIND Defined for code compiled with /GX (Enable Exception Handling). _DLL Defined when /MD or /MDd (Multithread DLL) is specified. _M_ALPHA Defined for DEC ALPHA platforms. It is defined as 1 by the ALPHA compiler, and it is not defined if another compiler is used. _M_IX86 Defined for x86 processors. See Table 1.3 for more details. _M_MPPC Defined for Power Macintosh platforms. Default is 601 (/QP601). See Table 1.4 for more details. _M_MRX000 Defined for MIPS platforms. Default is 4000 (/QMR4000). See Table 1.5 for more details. _M_PPC Defined for PowerPC platforms. Default is 604 (/QP604). See Table 1.6 for more details. _MFC_VER Defines the MFC version. Defined as 0x0421 for Microsoft Foundation Class Library 4.21. Always defined. _MSC_EXTENSIONS This macro is defined when compiling with the /Ze compiler option (the default). Its value, when defined, is 1. _MSC_VER Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined. _MT Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified. _WIN32 Defined for applications for Win32®. Always defined. As shown in following tables, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified. Table 1.3 Values for _M_IX86 Option in Developer Studio Command-Line Option Resulting Value Blend /GB _M_IX86 = 500 (Default. Future compilers will emit a different value to reflect the dominant processor.) Pentium /G5 _M_IX86 = 500 Pentium Pro /G6 _M_IX86 = 600 80386 /G3 _M_IX86 = 300 80486 /G4 _M_IX86 = 400 Table 1.4 Values for _M_MPPC Option in development environment Command-Line Option Resulting Value PowerPC 601 /QP601 _M_MPPC = 601 (Default) PowerPC 603 /QP603 _M_MPPC = 603 PowerPC 604 /QP604 _M_MPPC = 604 PowerPC 620 /QP620 _M_MPPC = 620 Table 1.5 Values for _M_MRX000 Option in Developer Studio Command-Line Option Resulting Value R4000 /QMR4000 _M_MRX000 = 4000 (Default) R4100 /QMR4100 _M_MRX000 = 4100 R4200 /QMR4200 _M_MRX000 = 4200 R4400 /QMR4400 _M_MRX000 = 4400 R4600 /QMR4600 _M_MRX000 = 4600 R10000 /QMR10000 _M_MRX000 = 10000 Table 1.6 Values for _M_PPC Option in Developer Studio Command-Line Option Resulting Value PowerPC 601 /QP601 _M_PPC = 601 PowerPC 603 /QP603 _M_PPC = 603 PowerPC 604 /QP604 _M_PPC = 604 (Default) PowerPC 620 /QP620 _M_PPC = 620

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧