作者 主题:优秀的C编程书籍 (Read 4167 times)

0位成员和2位客人正在查看此主题。

离线 努沙

  • 超级贡献者
  • ***
  • 职位:1939
  • 国家: 我们
回复:好的C程序设计书
« 在以下问题上回复#50: 十月26,2019,07:38:09下午»
代码: [选择]
/// moved here for this example. PIND0 is a platform-specific number defined elsewhere
#define DIO0_PIN PIND0

#define MASK(PIN) (1 << PIN)

/// check if pin is an input
#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) == 0)

/// check if pin is an input wrapper
#define GET_INPUT(IO) _GET_INPUT(IO)

好吧,这里'一个5层的真实情况,甚至没有出现头文件:GET_INPUT(0),_ GET_INPUT(0),MASK,  DIO0_PIN, PIND0
令牌粘贴(##)既神奇又令人困惑。这是一个非常简单的案例。如果你不这样做'不明白为什么需要最后的包装,抬头"Stringification".
(这些是从某些Repetier打印机固件中的fastio.h中清除的。)
 

离线 遗产

  • 超级贡献者
  • ***
  • !
  • 帖子:4415
  • 国家: ch
回复:好的C程序设计书
« 在以下回复#51: 十月26,2019,11:21:50下午»
在许多不同的平台上建立了许多不同的配置

是的,看来是这样。不同的体系结构,配置,供应商和平台。

我从未关注过layer0,但是我需要确切地知道几个寄存器的定义位置,以及哪个低级代码可以处理它们。

看起来很简单,只是小菜一碟...我还在四处搜寻 :D
 

在线的 西风

  • 超级贡献者
  • ***
  • 帖子:3367
  • 国家: 我们
回复:好的C程序设计书
« 在以下回复#52: 十月27,2019,12:38:57上午»
引用
代码: [选择]
    int cppfunc(arg)
        void *arg;  /* accept any type of argument, maybe */
    {
        PORTB = (int)arg;
    }

It's 1 /限制为固定数量的参数'完全解决这个问题。

没事 在varargs标准化之前,您可以使用指向最后一个参数的指针或类似的东西进行魔术操作。  I'我试图忘记...


引用
3 /编译器将对除指针以外的任何其他类型的参数发出警告

没有。  It's an old-style K&R定义,它根本不需要类型检查。 show的整个程序即使没有警告也不会发出警告"-Wall" (avr-gcc)... 函数调用将放置与您给定的参数一样多的参数(与"ints",通常)将其放置在任何地方,然后该函数将按自己认为合适的方式对其进行解释...


引用
2 /不会像用户期望的那样做任何事情
   ...这肯定不会在这里有用...
那不是't被写为一个功能示例。
就像我说的'在更好的方法标准化之前,我试图忘记我们滥用C来做我们想要做的所有方式。

您可以做的另一件事是编写汇编语言子例程,以执行所需的任何操作。 我想我们还是用"caller()"返回调用前一个函数的地址。
 

在线的 名义动物

  • 超级贡献者
  • ***
  • 帖子:2337
  • 国家: 科幻
    • 我的主页和电子邮件地址
回复:好的C程序设计书
« 在以下回复#53: 十月27,2019,12:56:30上午»
我想我们还是用"caller()"返回调用前一个函数的地址。
海湾合作委员会 提供为 __builtin_extract_return_addr(__ builtin_return_address(等级)), 和 等级==0 产生当前函数的返回地址,以及 等级==1 前一个函数的返回地址。  I've also used __builtin_frame_address(等级) 对应的堆栈框架。

其中一些非标准的东西在调试等方面非常有用。大概为什么它们仍然存在。
 

离线 遗产

  • 超级贡献者
  • ***
  • !
  • 帖子:4415
  • 国家: ch
回复:好的C程序设计书
« 在以下回复#54: 十月27,2019,04:40:30下午»
我看到有#define __weak定义函数的前缀。

___weak属性用于什么?
 

在线的 硅向导

  • 超级贡献者
  • ***
  • 帖子:5943
  • 国家: fr
回复:好的C程序设计书
« 在以下回复#55: 十月27,2019,05:27:08下午»
我看到有#define __weak定义函数的前缀。

___weak属性用于什么?

这是GCC属性,非标准属性,但非常方便(尽管也很滑)。
这允许定义一个可以被覆盖而不引起符号冲突的函数。含义,如果定义了功能"weak",您可以进一步定义具有相同标识符的函数,在这种情况下,将使用后者。

例如,在嵌入式开发中可能有用的一种方式是,您可以使用默认行为为所有中断/异常处理程序提供一个弱定义。然后,您可以轻松覆盖其中的任何一个。

//gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
 

在线的 名义动物

  • 超级贡献者
  • ***
  • 帖子:2337
  • 国家: 科幻
    • 我的主页和电子邮件地址
回复:好的C程序设计书
« 在以下回复#56: 十月27,2019,09:50:05下午»
是的,SiliconWizard写了什么。

此外,它暴露了 虚弱的 symbol 设施ELF文件提供;它实际上不会生成其他代码,只是在符号表中将该符号标记为弱/可覆盖。 因此,它与ELF目标文件和链接有关,而与C本身无关。
 

离线 马克

  • 支持者
  • ****
  • 职位:1729
  • 国家: 我们
回复:好的C程序设计书
« 在以下回复#57: 十月28,2019,12:12:34上午»
编辑:对于最新的C程序员来说,这不是'完全正确。如果你'如果使用兼容C11的编译器,则可以使用新的_Generic关键字将println()定义为宏,并根据其参数类型扩展到println()函数的不同版本。
所以...
是的,可能是C11。你们当中有多少人知道C11的添加? ::)
我不'已知C11的复杂性,但是GCC支持类似的东西__builtin_types_compatible_p(TYPE1,TYPE2),用于测试TYPE1是否与TYPE2兼容。  A series of if'可以构建为处理多种类型。

显然_Generic自4.9起在gcc中使用,但功能't new.
 

离线 wl

  • 经常贡献者
  • **
  • 帖子:339
  • 国家: fr
回复:好的C程序设计书
« 在以下回复#58: 十二月30,2019,06:55:10下午»
I'一言以蔽之"C Traps and Pitfalls",作者:安德鲁·科尼格(Andrew Koenig)。它没有't假装是综合性的,但是它涵盖了许多最容易被忽视的最常见错误,这些错误可能是缺乏经验的程序员或由于语言和操作环境的不足而引起的。它',因为它已经很老了,所以围绕“未定义行为”的一些较新问题没有像您今天发现的那么详细。

我最喜欢的关于C的第二本书是:
http://progforperf.github.io/Expert_C_Programming.pdf
 


分享我

掘客  Facebook  SlashDot  可口的  Technorati  推特  谷歌  雅虎
中频