cxx11emu.h 和 logprint.h

cxx11emu.h 和 logprint.h

/* Start of cxx11emu.h */

#ifndef STDBP_CXX11EMU_H_
#define STDBP_CXX11EMU_H_

#if defined(__cplusplus) || defined(c_plusplus)

/// @todo Value may not be correct, because as of writing C++17 isn't official
#if __cplusplus >= 201703L
#define CPP17
#endif
#if __cplusplus >= 201402L
#define CPP14
#endif
#if __cplusplus >= 201103L
#define CPP11
#endif

/* Namespace macros. It's sometimes necessary to put something into the "std"
 * namespace. For example, a specialization of std::hash. These macros can be
 * used to put the code in the correct namespace.
 */
#ifdef CPP17
#define CPP17_NAMESPACE std
#else
#define CPP17_NAMESPACE cpp17
#endif
#ifdef CPP14
#define CPP14_NAMESPACE std
#else
#define CPP14_NAMESPACE cpp14
#endif
#ifdef CPP11
#define CPP11_NAMESPACE std
#else
#define CPP11_NAMESPACE cpp11
#endif

namespace cpp11
{
}

#ifndef CPP11
namespace cpp11
{
class nullptr_t
{
public:
    nullptr_t(): pad_(0)
    {
    }

    template< class T >
    operator T*() const
    {
        return 0;
    }

    template< class C, class T >
    operator T C::*( ) const
    {
        return 0;
    }
private:
    void* pad_; /* std requires : sizeof(nullptr_t) == sizeof(void*) */ 
    void operator&() const;
};

const cpp11::nullptr_t nullptr;
}

namespace cpp11
{
/* Static assertions */
#ifndef static_assert
#define XXJOIN(x, y) XXJOIN_AGAIN(x, y)
#define XXJOIN_AGAIN(x, y) x##y
#define static_assert(exp) typedef char 
    CONCATE(assertion_failed_at_line_, __LINE__)[(exp) ? 1 : -1]
#define static_assert2(exp, str) typedef char 
    CONCATE(str##_at_Line, __LINE__)[(exp) ? 1 : -1]
#endif /* End of static_assert */
} // namespace cpp11

#endif /* End of CPP11 */

namespace cpp14
{
}

namespace cpp17
{
}

/* cpp points to either std or cpp11/14/17 as appropriate
 */
namespace cpp
{
using namespace ::std;
using namespace ::cpp11;
using namespace ::cpp14;
using namespace ::cpp17;
}

#endif /* End of defined(__cplusplus) || defined(c_plusplus) */

#endif /* End of STDBP_CXX11EMU_H_ */

/* End of cxx11emu.h */
/* Start of logprint.h */

#ifndef UTIL_LOGPRINT_H_
#define UTIL_LOGPRINT_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>

/**
 * 在使用 FreeBSD 平台上, 使用 -pthread (注意,没有'l') 参数,
 * gcc 会自动链接系统当前版本推荐的 thread lib 以及对应的 thread safe 的 c func。
 * 参考: http://www.zeroc.com/forums/help-center/4334-ice-freebsd.html
 * 参考: http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html
 *
 * 注意:FreeBSD 中,其实包含了 libc_r, libthr, libpthread(libkse) 三个版本的多线程库。
 * lib_r, Reentrant C Library,最老的版本,基本废弃。
 * libthr, 1:1 thread model,8.0 开始,它就是默认的库。
 * libpthread(libkse), M:N thread model,6.x, 7.x 下的默认库。
 * 其中 libpthread 默认使用的是 PTHREAD_SCOPE_PROCESS,而 libthr 用的是 PTHREAD_SCOPE_SYSTEM。
 * 理论上来说,libthr 在多核状态下,且服务器主要就跑你的程序的时候,能更好的利用 cpu。
 * 参考: http://kasicass.blog.163.com/blog/static/395619200911289639311
 * 
 */
#include <pthread.h>

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif /* End of defined(__cplusplus) || defined(c_plusplus) */

#define LOGPRINT_PATHNAME        "logprint.log"
#define LOGPRINT_STRING_LEN        (1024u)

int g_log_fd;
char g_msg_buf[LOGPRINT_STRING_LEN];
pthread_mutex_t g_log_mutex;

#ifdef _LOGPRINT_

#define LOGPRINT(fmt, args...)                                                   
    do                                                                           
    {                                                                            
        pthread_mutex_lock(&g_log_mutex);                                        
        g_log_fd = open(LOGPRINT_PATHNAME, O_WRONLY | O_CREAT | O_APPEND, 0666); 
        sprintf(g_msg_buf, "pid(%d):tid(%lu):file(%s):func(%s):line(%d) - " fmt, 
                (int)getpid(), (unsigned long int)pthread_self(),                
                __FILE__, __func__, __LINE__, ##args);                           
        write(g_log_fd, g_msg_buf, strlen(g_msg_buf));                           
        close(g_log_fd);                                                         
        pthread_mutex_unlock(&g_log_mutex);                                      
    } while (0)

#else

#define LOGPRINT(fmt, args...) NULL

#endif /* End of _LOGPRINT_ */

#if defined(__cplusplus) || defined(c_plusplus)
} // End of extern "C"
#endif /* End of defined(__cplusplus) || defined(c_plusplus) */

#endif /* End of UTIL_LOGPRINT_H_ */

================ End

原文地址:https://www.cnblogs.com/lsgxeva/p/11696025.html