C语言中的Far是什么意思?

21
const struct sockaddr FAR* name,

8
这句话的意思是,我正在等待比尔·盖茨的电话,并且他想与你谈论如何让他在20世纪80年代所说的“640k将足矣”言论重现。 - R.. GitHub STOP HELPING ICE
3个回答

32

这是一个来自于分段内存结构时代的旧扩展。基本上意味着“这是一个指针,需要能够指向任何地址,而不仅仅是代码所在段中的内容。”

查看更多信息请访问维基百科页面


4
除非出于某些有趣的原因需要编写16位代码(这种情况非常非常非常罕见),否则基本上没有用处,对普通人来说毫无意义。 - TomTom
2
在其他一些平台上,可能会出现近指针和远指针(意义不完全相同),因此如果你进行交叉编译,你可能需要处理它。 - Vovanium
2
@ollydbg - 对于当今的x86 PC平台和应用程序,是的。但对于其他平台,如单片嵌入式系统,则不适用。 - J. Polfer
是的,它今天完全没用,并且从未成为该语言的一部分。 - R.. GitHub STOP HELPING ICE
@Nick:我不确定你指的是哪个,但是任何一个针对反向分段架构的好编译器都会有一个“巨大”的内存模型可供选择,以使所有指针都足够大,可以容纳任何地址。那就是我在为DOS/Win16编写代码时经常使用的方法。 - R.. GitHub STOP HELPING ICE
显示剩余3条评论

4

far在C语言中没有任何意义。请查看C99标准 [PDF],看看是否能找到有关far指针的提及。Far指针是为了支持分段内存模型而添加到针对8086/80286体系结构的编译器的扩展。


3

如果你没有使用16位x86编译器,它就不起作用。

如果你查看Win32头文件WinDef.h(在Visual Studio中,只需右键单击源代码中的FAR一词,然后选择“转到定义”即可),你会发现它是一个宏定义,定义为far,而far又被定义为什么都不是的宏!

它只是为了实现将旧的Win16源代码编译为Win32而存在。在16位x86编译器中,far是一种编译器扩展关键字,用于支持seg::offset指针,这些指针解析为20位地址(16位x86仅有1MB地址空间!)。它们与16位near指针不同,后者仅包括来自当前段的::offset。


4
其他几个平台也有近指针和远指针,例如 AVR。 - Vovanium
1
@Vovanium:你能提供引用吗?GNU AVR编译器肯定不支持farnear关键字。然而,东芝MeP的GNU编译器具有nearfar,但不是出于与x86实模式相同的架构原因。因此,是的,一些体系结构仍需要扩展来处理不同的内存空间;不仅仅是nearfar。哈佛体系结构和DSP通常需要扩展。 - Clifford
2
IAR具有微小、近、远和巨大的存储说明符(请参见http://supp.iar.com/FilesPublic/SUPPORT/000373/memoryusage.pdf)。是的,指针大小说明符可能与x86不同。 - Vovanium
@Vovanium:感谢您抽出时间。我从未需要使用具有足够内存需要远指针的AVR!这就是ARM的用途!;) - Clifford
Clifford:看,ATXMEGA对于大型应用来说既强大又快速。因此,如果有人喜欢AVR,那么它是一个不错的选择。但我也喜欢32位MCU。 :) - Vovanium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接