我想离线提供一个Windows API参考文档.MSDN很好,但是当我无法访问互联网时,我也需要这种信息.
pdf,chm,help(对于emacs)没问题.
当然我不是第一个想要那个的人,但我找不到任何东西.有人可以指向一个地方找到它吗?
我看到SDK中可能有引用,但安装它需要大约200 MB,我只需要文档.
我想知道使用static关键字作为文件中变量的范围限制,用C.
我认为构建C程序的标准方法是:
static.static如果变量未在h文件中发布,我认为声明gobal的原因有两个:
extern.我认为链接器不喜欢变量是extern和static.(我不喜欢重新声明其他人拥有的变量的文件的想法,这extern是可以的做法吗?)还有其他原因吗?
也是一样的static功能.如果原型未在h文件中发布,其他文件可能无法使用该函数,那么为什么要定义它static呢?我可以看到同样的两个原因,但没有更多.
我有一个文本文件,其中包含宏名称列表(每行一个).我的最终目标是获取宏名称出现在当前目录文件中的次数.
宏的名字在C:\temp\macros.txt.
type C:\temp\macros.txt 在命令提示符下打印列表.
现在我想将输出传递给标准输入findstr.
type C:\temp\macros.txt | findstr *.ss
(ss是我正在寻找宏名称的文件类型).
这似乎不起作用,我得不到结果(非常快,似乎根本没有尝试).findstr <the first row of the macro list> *.ss确实有效.
我也尝试findstr *.ss < c:\temp\macros.txt过没有成功.
我曾经使用过一个非常好的emacs功能,它可以均匀地设置我的所有窗口(emacs窗口,而不是帧)宽度.
如果你打开emacs并C-x 3连续两次,你会得到三个垂直窗口.然后运行我正在寻找的功能使这些窗口的宽度相同.
我不能为我的生活再次找到这个功能.不会有人帮助我:
谢谢!
我很快就开始维护一系列包含相同嵌入式软件变体的产品.由于我已经玩git一年并非常欣赏它,我很可能将它用于源代码控制.
我可以看到几个选项来维护固件的变体,但没有一个让我高兴.您为自己的工作申请的最佳做法是什么?
我能想到的替代方案:
定义.预处理.优点:源代码中始终存在所有内容,因此很难错过其中一个产品的更新.缺点:难以阅读.它可能没问题,而我们只有两个变体,当它变成四个或更多时会很痛苦.此外,应用DRY原则似乎更难(不要重复自己).
每个产品变体一个分支.如果包含适用于所有产品的更改,则必须将更改合并到其他产品.缺点:如果提交包含所有产品的更改和特定变体的更改,则会出现问题.当然,您可以确保提交仅包含一种更改:此产品更改或整个系列更改.但是试着强迫一个团队?加上合并不起作用,我们应该采摘樱桃.对?
一个核心库作为子模块.使包含核心功能的所有文件成为存储库.所有产品都包含一个版本的核心存储库作为子模块.缺点:我看不出最终会出现核心子模块的变体.然后我们再次陷入困境,然后我们再次使用定义或坏事.有分支的核心存储库?然后我们回到上一个替代方案:必须合并适用于所有分支的更改,但合并还包括产品特定的内容.
创建每个模块的存储库.例如,显示驱动程序的存储库,另一个用于电源管理硬件,另一个用于用户输入接口,...优点:良好的模块化.只需选择您需要的模块作为子模块来制作新产品!所有子模块都可能具有分支,例如,变体以不同的方式使用硬件.缺点:有很多模块,每个模块都跟踪几个文件(包含文件和源文件).麻烦.有人在某些模块中进行了重要更新吗?然后,如果合适,有人需要在此模块的其他分支中包含更改.然后有人还必须更新每个产品存储库中的子模块.相当一些工作,我们有点失去了git的快照方面.
你是怎么做到的,它是如何运作的?或者你会怎么做?
我有一种感觉,我应该有樱桃采摘的经验.
我真的想切换到emacs,但学习设置环境真的很痛苦.每个人都说它值得,所以我继续说.
我希望我的c代码以这种方式实现:
if(asdf)
{
asdr = 1;
}
Run Code Online (Sandbox Code Playgroud)
根据当前的标准(我知道,不要让我开始),可能是:
if(asdf) {
asdr = 1;
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法将缩进大小从2更改,它总是看起来像GNU标准:
if(asdf)
{
asdr = 1;
}
Run Code Online (Sandbox Code Playgroud)
,我不喜欢.这是我在.emacs中添加的内容:
; Warn in C for while();, if(x=0), ...
(global-cwarn-mode 1)
; no electric mode in c
(c-toggle-electric-state -1)
; indent the current line only if the cursor is at the beginning of the line
(setq-default c-tab-always-indent nil)
(setq-default c-indent-level 4)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
(setq-default c-basic-offset 4)
(setq-default c-basic-indent 4)
; These commands I read …Run Code Online (Sandbox Code Playgroud) 重要提示:这个问题不是关于支撑风格优于另一支风格的优越性.我目前正在改变样式,以便自己评估哪一种我觉得在我的情况下效果最好,而且我喜欢Allman和1TBS一样多.
1TBS支撑样式的用户,如何在if语句和后续代码中格式化长条件?
if ((this_is_the_first_part_of_a_long_condition)
&& (the_second_part_is_shorter__wait_no_it_is_not)
&& (and_one_more_for_the_road)) {
here_comes_the_block_code();
}
Run Code Online (Sandbox Code Playgroud)
我觉得必须有更好的方法.我目前的方法是在代码块的第一行之前添加一个空行.Allman在这种情况下看起来也不是很好,虽然在我看来更具可读性.
for循环的另一个例子:
for (int relevant_counter_variable_name = START_VALUE;
intelligent_expression_that_may_include_the_counter_variable;
relevant_counter_variable_update) {
first_code_line_inside_the_block();
}
Run Code Online (Sandbox Code Playgroud)
不太好......
KNF(8个空格缩进)会有所帮助,但我想避免这种情况.我还有其他一些选择,但我想听听是否有某种标准方式.
我想为模块变量提供客户端模块的只读访问权限.几种解决方案
1.最常见的一个:
// module_a.c
static int a;
int get_a(void)
{
return a;
}
// module_a.h
int get_a(void);
Run Code Online (Sandbox Code Playgroud)
这使得每个变量共享一个函数,一个函数调用(我正在考虑执行时间和可读性),每次读取都有一个副本.假设没有优化链接器.
2.另一种方案:
// module_a.c
static int _a;
const int * const a = &_a;
// module_a.h
extern const int * const a;
// client_module.c
int read_variable = *a;
*a = 5; // error: variable is read-only
Run Code Online (Sandbox Code Playgroud)
我喜欢这样,除了客户端需要读取指针内容的事实.此外,每个只读变量都需要其extern const指针const.
3.受第二个解决方案启发的第三个解决方案是隐藏结构后面的变量和结构的外部指针.module_name->a在我看来,符号在客户端模块中更具可读性.
4.我可以为函数创建内联定义get_a(void).它仍然看起来像客户端模块中的函数调用,但应该进行优化.
我的问题:
是否有一种最佳方法可以在模块中修改变量,在其他模块中只读为只读模块?最佳方面是什么?
您接受或拒绝使用上述哪种解决方案?为什么?
我知道这是微观优化 - 我可能没有实现它 - 但我仍然对这种可能性感兴趣,最重要的是知道.
在Win7框上读取时,在winXP框中创建的提交消息会生成警告.
我的名字包含特殊字符(ö),我想这是问题的根源,因为我的名字在提交中.我在尝试隐藏在winXP上创建的提交上的更改时看到了这个问题:
Warning: commit message does not conform to UTF-8.
我想检查用于在winXP上生成提交的编码,但无法找到.
$ git config --get i18n.commitencoding
在两台机器上都返回空白.
http://www.kernel.org/pub/software/scm/git/docs/git-commit.html似乎说git会检查提交对象中的编码.
git log,git show,git blame和friends查看提交对象的编码头,并尝试将日志消息重新编码为UTF-8,除非另有说明.
那很好,但是为什么git会抱怨win7而不是winXP?
msysgit版本在两台机器上都是相同的:1.7.4.msysgit.0.
我在C中的典型嵌入式软件中找不到关于文件结构的好建议.这里有很多这样的问题和答案,但没有一个涵盖我提出的问题,或者似乎适用于C中的嵌入式系统.
我知道没有银弹.如果这有助于缩小建议,我的典型应用程序必须适合具有8到32 kB闪存和几KB RAM的目标.时钟频率范围为4至20 MHz.
我见过以层为单位组织的源代码,每个层都有自己的目录:
问题是模块通常在所有这些层中都有文件,因此在目录中分离层意味着单个模块的文件遍布整个地方.封装不良.
每个模块一个目录.好事是真正的封装.我不知道如何做得好是如何发布模块的API.开源PC应用程序SW似乎:
$PROJ_ROOT/includes.这样我可以-I$PROJ_ROOT/includes在我的编译器命令中拥有(或等效),并且在我的#include语句中没有搜索路径.
问题是API在模块目录之外,从而破坏了封装.例如,在VCS中将模块维护为独立模块更加困难.
与上面相同,但使用模块目录中的API头文件.适当的封装和更容易的版本控制模块,但API头文件与其他模块头文件处于同一级别,这些文件是私有的.在模块之外包含这样一个"私有"头文件的诱惑对于未来的开发人员来说可能太大了,并且不可见哪个h文件是公开的,哪些不是.
只将API头文件直接放在模块目录中,将子目录中的所有其他文件放在几个目录中.这可能有效,但我觉得结构变得越来越复杂,我并不喜欢.
我觉得我应该选择2或4,但会非常感激洞察力.如何解决我描述的相关缺点?其他选择?
成功的开源SW这种大小的链接也可能很好.也欢迎文学建议.