宏定义相关
可以由传进来的变量生成任意变量类型的变量
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)
{
// ...
}
}
|