小编wan*_*jie的帖子

如何通过Make命令行将-g3标志传递给gcc?

我正在调试我们的项目,但我发现项目是用-g编译的,而不是-g3,这意味着我无法在gdb中扩展宏.我想在gcc中添加-g3标志,但我不想修改Makefile,我只想通过Make命令行添加这个标志,有人能告诉我怎么做吗?谢谢!

command-line gcc makefile

22
推荐指数
1
解决办法
2万
查看次数

struct hostent是否有一个字段"h_addr"?

我遇到了以下代码快照:

struct hostent *hp;
 hp = my_gethostbyname(localhost);
    if (hp == NULL) {
       ls_syslog(LOG_ERR, I18N_FUNC_FAIL, fname, "my_gethostbyname()");
       return -1;
    }
    strcpy(localhost, hp->h_name);

    memcpy(&addr, hp->h_addr, hp->h_length);
Run Code Online (Sandbox Code Playgroud)

我对最后一个语句感到困惑,struct hostent的声明是这样的:

struct hostent {
   char *h_name;       /* official name of host */
   char **h_aliases;   /* alias list */
   int h_addrtype;     /* host address type */
   int h_length;       /* length of address */
   char **h_addr_list; /* list of addresses */
};
Run Code Online (Sandbox Code Playgroud)

它没有名为"h_addr"的字段,但代码确实可以编译,任何人都可以告诉我为什么?谢谢.

linux hostent

18
推荐指数
1
解决办法
2万
查看次数

为什么LL语法不能左递归?

龙书中,LL语法定义如下:

语法是LL,当且仅当适用于任何生产时A -> a|b,以下两个条件适用.

  1. FIRST(a)并且FIRST(b)是不相交的.这意味着它们不能同时衍生出来EMPTY

  2. 如果b能够获得EMPTY,则a不能推导开头的任何字符串FOLLOW(A),就是FIRST(a)FOLLOW(A)必须是不相交的.

我知道LL语法不能保持递归,但正式的原因是什么?我猜左递归语法会违反规则2,对吧?例如,我写了以下语法:

S->SA|empty
A->a
Run Code Online (Sandbox Code Playgroud)

由于FIRST(SA) = {a, empty}FOLLOW(S) ={$, a},然后FIRST(SA)FOLLOW(S)不脱节,所以这个语法不是LL.但我不知道这是左递归FIRST(SA)FOLLOW(S)不是不相交,还是有其他原因?换句话说,每个左递归语法都会产生违反LL语法条件2的情况吗?

grammar ll-grammar left-recursion

18
推荐指数
3
解决办法
9681
查看次数

eax存储返回值的大小如何大于4个字节?

EAX用于存储32位平台中函数的返回值,我只是想知道一个函数的返回值大小是否大于4个字节,eax如何处理呢?在这种情况下,OS可以将返回值保存在堆栈中并将堆栈的地址存储在EAX中,但是OS如何判断存储在EAX中的值是返回值的地址还是实际上是返回值本身?

assembly return-value cpu-registers

7
推荐指数
1
解决办法
2308
查看次数

如何使用gdb来捕获程序的"退出"

我正在调试一个相当复杂的项目,我有它的源代码,目前我需要知道守护进程在某些情况下退出时的堆栈跟踪,但是通过整个代码非常耗时,我想用gdb来帮助这个,但是像"catch exit"这样的命令不起作用,它告诉我"Catch of exit尚未实现",那么有人能告诉我如何使用gdb来捕获守护进程的退出事件吗?谢谢.

gdb

6
推荐指数
2
解决办法
3771
查看次数

$?VAR在csh中是什么意思?

我遇到了用csh编写的以下代码:

if ( ! $?LM_LICENSE_FILE ) then
    setenv LM_LICENSE_FILE $_LmLicense
else
    switch("$LM_LICENSE_FILE")
    case *${_LmLicense}*:
         breaksw
    default:
         setenv LM_LICENSE_FILE "${_LmLicense}:$LM_LICENSE_FILE"
    endsw
endif
Run Code Online (Sandbox Code Playgroud)

请注意这一行:

if ( ! $?LM_LICENSE_FILE ) then
Run Code Online (Sandbox Code Playgroud)

$?做什么$?LM_LICENSE_FILE

LM_LICENSE_FILE是一个shell变量(或更确切地说是宏),我知道该变量$LM_LICENSE_FILE用于检索其值,但是后面跟一个问号$,即$?LM_LICENSE_FILE它的含义是什么?

shell macros csh

5
推荐指数
1
解决办法
3831
查看次数

为什么在点切割表达式中使用两颗星来匹配返回类型?

在Spring in Action一书中,我发现了以下AspectJ点切割表达式:

@Pointcut("execution(** concert.Performance.perform(..))")
void performance();
Run Code Online (Sandbox Code Playgroud)

这将指定切入点性能,以包括名称为"perform"且返回类型可以为any的方法.但请注意,它使用两颗星(**)来匹配返回类型,正如我已经尝试过的,一颗星(*)可以完美地完成这项工作,这意味着以下行可以做同样的事情:

 @Pointcut("execution(* concert.Performance.perform(..))")
 void performance();
Run Code Online (Sandbox Code Playgroud)

我注意到许多AspectJ演示使用两颗星(**)来匹配"任何返回类型",所以有什么理由这样做吗?使用一颗星匹配"任何返回类型"有什么问题?

aop spring spring-aop

5
推荐指数
1
解决办法
625
查看次数

linux-PAM 会话和 linux 进程会话一样吗?

我们都知道 linux 系统调用 setid() 允许我们随时创建新会话,尽管典型的做法是在我们登录或要启动新守护进程时。而且我注意到 linux-PAM(可插拔认证模块)也有“会话管理”的概念,所以我的问题是:Linux PAM 中的会话是否与 setid() 创建的会话相同?在 linux PAM 会话中通常可以做什么?谢谢。

session pam

2
推荐指数
1
解决办法
1162
查看次数