C/C++知识点之C指针原理(13)-C指针基础
小标 2019-02-19 来源 : 阅读 645 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C指针原理(13)-C指针基础,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C指针原理(13)-C指针基础,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C指针原理(13)-C指针基础

规范路径格式,win32(windows环境下,路径之间的各个目录分隔将“\”改为"/",用“/”分隔,这样的好处是在UNIX和WINDOWS都兼容,而且也简化了目录表示。


#ifdef _WIN32


static char normalize_slashes(char path)
{
    char p;
    for (p = path; 
p; ++p)
        if (p == '\')
            
p = '/';
    return path;
}


static HMODULE tcc_module;


win32环境下,我们假设lib和include在tcc.exe所在的位置。


/ on win32, we suppose the lib and includes are at the location of 'tcc.exe' /
static void tcc_set_lib_path_w32(TCCState s)
{
    char path[1024], 
p;


   得到 当前TCC的完整路径
    GetModuleFileNameA(tcc_module, path, sizeof path);
   得到路径的目录部分,注意得到的值是一个位置,指示目录部分的结尾处


    p = tcc_basename(normalize_slashes(strlwr(path)));


   跳过bin目录名,取前面的目录,因为tcc.exe可能在/bin/目录下
    if (p - 5 > path && 0 == strncmp(p - 5, "/bin/", 5))
        p -= 5;


   下面取前面的目录,p--是为了删掉目录的最后一个"/"
    else if (p > path)
        p--;
    *p = 0;


    设置lib路径
    tcc_set_lib_path(s, path);
}


加入系统目录


#ifdef TCC_TARGET_PE
static void tcc_add_systemdir(TCCState *s)
{
    char buf[1000];
    GetSystemDirectory(buf, sizeof buf);
    tcc_add_library_path(s, normalize_slashes(buf));
}
#endi


静态链接


#ifndef CONFIG_TCC_STATIC
void dlclose(void *p)
{
    FreeLibrary((HMODULE)p);
}
#endif


生成dll


#ifdef LIBTCC_AS_DLL
BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
    if (DLL_PROCESS_ATTACH == dwReason)
        tcc_module = hDll;
    return TRUE;
}
#endif
#endif


下面是复制并截断字符串的函数,函数读入缓冲区的指针、缓冲区的大小以及源字符串,将源字符串截断并复制到缓冲区中。


/****/


/ copy a string and truncate it. /


PUB_FUNC char pstrcpy(char buf, int buf_size, const char *s)


{


    char q, q_end;


    int c;


    缓冲区大于0,则可以开始复制字符串。


    if (buf_size > 0) {


        计算复制字符串的起始位置


        q = buf;


        q_end = buf + buf_size - 1;



        复制buf_size大小的字符串到新字符串中,最后加上字符串终结符'\0'

        while (q < q_end) {

            c = *s++;

            if (c == '\0')

                break;

            *q++ = c;

        }

        *q = '\0';

}

返回新生成的字符串

    return buf;

}


可以调用上面这个函数,传入指针,指定新字符串在缓冲区的位置,可以先生成一个大的缓冲区,再分次将不同的字符串截断复制进来。


接下来是字符串拼接函数,将新字符串截断并拼接到缓冲区中。



/* strcat and truncate. */
PUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s)
{
    int len;
    len = strlen(buf);
    if (len < buf_size) 
        pstrcpy(buf + len, buf_size - len, s);
    return buf;
}


直接在内存中复制字符串,不是以字符串终结符为标志进行复制,如下:


PUB_FUNC char *pstrncpy(char *out, const char *in, size_t num)
{
    memcpy(out, in, num);
    out[num] = '\0';
    return out;
}


下面这个函数,找到文件完整路径中的目录部分,本身很普通,其实现有些意思,从后面向前面找


/ extract the basename of a file /
PUB_FUNC char tcc_basename(const char name)
{
    先找到字符串终结符0   


    char *p = strchr(name, 0);


   然后从后向前移动指针,发现有目录分隔符后,停止


    while (p > name && !IS_DIRSEP(p[-1]))
        --p;


   返回目录在文件路径字符串的结尾位置。
    return p;
}


下面找到文件扩展名



/* extract extension part of a file
 *
 * (if no extension, return pointer to end-of-string)
 */
PUB_FUNC char *tcc_fileextension (const char *name)
{
    char *b = tcc_basename(name);

   找到标注扩展名前面的点号
    char *e = strrchr(b, '.');

   返回扩展名
    return e ? e : strchr(b, 0);

}

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程