我在Git中看到一种对我来说非常神秘的行为.我保留了从Github克隆的Linux存储库,以便在本地使用Git.为了清楚起见,我在这个存储库中做的不多:我获取更改,更新master,签出特定版本,有时我会尝试使用Git GUI来查看大型项目中可视化的外观.TLDR版本:我从未对其中的文件进行任何更改.
今天早些时候,我签出master并从Github取消了更改.一切似乎都没事.但我怀疑它实际上没有.这就是现在的git status样子.
axel@macbook ~/Depots/linux $ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: include/linux/netfilter/xt_connmark.h
# modified: include/linux/netfilter/xt_dscp.h
# modified: include/linux/netfilter/xt_mark.h
# modified: include/linux/netfilter/xt_rateest.h
# modified: include/linux/netfilter/xt_tcpmss.h
# modified: include/linux/netfilter_ipv4/ipt_ecn.h
# modified: include/linux/netfilter_ipv4/ipt_ttl.h
# modified: include/linux/netfilter_ipv6/ip6t_hl.h
# modified: …Run Code Online (Sandbox Code Playgroud) 在C中使用未定义的结构有什么好处吗?
SQLite源代码中的示例:
/* struct sqlite3_stmt is never defined */
typedef struct sqlite3_stmt sqlite3_stmt;
Run Code Online (Sandbox Code Playgroud)
对象被操纵如下:
typedef struct Vdbe Vdbe;
struct Vdbe {
/* lots of members */
};
int sqlite3_step(sqlite3_stmt *pStmt) {
Vdbe *v = (Vdbe*) pStmt;
/* do stuff with v... */
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么不直接使用通常的抽象类型,在私下定义的实际结构foo.c源和公众typedef的foo.h头?