C 语言开发笔记

宏定义相关

可以由传进来的变量生成任意变量类型的变量

1
#define typeof(expr) __res = (expr);

函数相关

getopt

问题情景:打算调用两次 getopt 函数,兼容 DEBUG 测试

思路:第二次运行之前,将 optind 的值重新赋值为 1

在 x86 架构下运行正常,但是在 arm 下没有通过输入数据的判断函数

经 GDB 调试发现,在 arm 下运行完 getopt 函数后,其第二个参数内的指针地址会乱序

解决方案:不要用 argv 当 getopt 的参数,建立一个指针缓存变量,不断拷贝原本 argv 内的地址即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <alloca.h>
#include <unistd.h>

int main(int argc, char *argv[], char *envp[])
{
    int ret, i;
    extern char *optarg;
    extern int optind;
    char **targv = alloca(sizeof(char *) * argc);
    for (i = 0; i < argc; ++i)
    {
        targv[i] = argv[i];
    }
    while ((ret = getopt(argc, targv, ":v:")) != -1)
    {
        // ...
    }
    optind = 1;
    for (i = 0; i < argc; ++i)
    {
        targv[i] = argv[i];
    }
    while ((ret = getopt(argc, targv, ":A:B:")) != -1)
    {
        // ...
    }
}