ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一些跨平台函数兼容处理

2021-08-03 11:01:05  阅读:241  来源: 互联网

标签:__ int32 函数 mem 兼容 WIN32 跨平台 endif else


以下纯属个人观点,如有不妥之处,请大家指正

对于C/C++,可变参数宏在windows和linux下是不同的。需要分别定义

#include <stdarg.h>  
​
#if defined(_WIN32)     //C99
#define dbg(level, fmt, ...)  \
    do{\
            log(LogLevel, fmt, __VA_ARGS__); \
        }   \
    }while(0)
#else //linux内核代码
#define dbg(level, fmt, args...)  \
    do{\
            log(LogLevel, fmt,##args); \
        }   \
    }while(0)
#endif

select做延迟

static void sleep_ms(int32_t ms)
{
    struct timeval timeout;
    int ret = 0;
    int32_t fd;
​
    timeout.tv_sec = 0;
    timeout.tv_usec = ms * 1000;//10ms
​
#if defined(_WIN32)
    //Sleep(ms);    //Sleep函数延迟ms精度不够
    fd_set fds;
    FD_ZERO(&fds);
    fd = socket(AF_INET, SOCK_DGRAM, 0);
    FD_SET(fd, &fds);
    ret = select(0, NULL, NULL, &fds, &timeout);
    closesocket(fd);
#else
    select(0,NULL,NULL,NULL,&timeout);
#endif
}

信号量

sem_t* sem;
​
#if __APPLE__
    sem = sem_open(SEM_NAME,O_CREAT, S_IRUSR | S_IWUSR, 0);
#else
    ret = sem_init(sem, 0, 0);
#endif

线程命名

#if __APPLE__
    #include "TargetConditionals.h"
    #if TARGET_OS_MAC
    #include <pthread.h>
    #endif
#endif  
    
#if _WIN32
    SetThreadDescription(GetCurrentThread(), "abcdThread");
#elif TARGET_OS_MAC
    pthread_setname_np("abcdThread");
#else
    prctl(PR_SET_NAME,"abcdThread");
#endif  

strcasecmp

#if _WIN32
            if (stricmp(Name, "Name") == 0) 
#else
            if (strcasecmp(Name, "Name") == 0) 
#endif

socket控制

#if _WIN32
    ioctlsocket(sock, FIONREAD, &length);
    closesocket(sock);
#else
    ioctl(sock, FIONREAD, &length);
    close(sock);
#endif

strtok_r strtok_s

char         list[123];
char*       token  = NULL;
char *      holder  = NULL;
    
#if _WIN32
    token = strtok_s(list, DP_SEPARATOR, &holder);
#else
    token = strtok_r(list, DP_SEPARATOR, &holder);
#endif

ns

static int64_t get_ns()
{
    int64_t result;
    struct timespec ts;
#if _WIN32
    LARGE_INTEGER m_liPerfFreq = { 0 };
    LARGE_INTEGER liPerfNow = { 0 };
    QueryPerformanceFrequency(&m_liPerfFreq);
    QueryPerformanceCounter(&liPerfNow);
    ts.tv_sec = (liPerfNow.QuadPart / 1000000) / m_liPerfFreq.QuadPart;
    ts.tv_nsec = (liPerfNow.QuadPart * 1000) / m_liPerfFreq.QuadPart;
#else
    clock_gettime(CLOCK_MONOTONIC, &ts);
#endif
    result = 1000000000LL * (int64_t)ts.tv_sec + (int64_t)ts.tv_nsec;
    return result;
}

*原子操作

#if _WIN32
#include <intrin.h>
#endif

int32_t atomic_add32(volatile int32_t *mem, int32_t val)
{
#if _WIN32
    return _InterlockedExchangeAdd(mem, val);
#else
    return __sync_fetch_and_add(mem, val);
#endif
}

int32_t atomic_sub32(volatile int32_t *mem, int32_t val)
{
#if _WIN32
    val = 0 - val;
    return  _InterlockedExchangeAdd(mem, val);
#else
    return  __sync_fetch_and_sub(mem, val);
#endif
}

int32_t atomic_inc32(volatile int32_t *mem)
{
#if _WIN32
    return _InterlockedIncrement(mem);
#else
    return __sync_fetch_and_add(mem, 1);
#endif
}

int32_t atomic_dec32(volatile int32_t *mem)
{
#if _WIN32
    return _InterlockedDecrement(mem);
#else
    return __sync_sub_and_fetch(mem, 1);
#endif
}

int32_t atomic_cas32(volatile int32_t *mem, int32_t with, int32_t cmp)
{
#if _WIN32
    return _InterlockedCompareExchange(mem, with, cmp);
#else
    return __sync_val_compare_and_swap(mem, cmp, with);
#endif
}

标签:__,int32,函数,mem,兼容,WIN32,跨平台,endif,else
来源: https://blog.csdn.net/qq_40179343/article/details/119345252

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有