繁体   English   中英

volatile和__volatile__之间的区别

[英]Difference between volatile and __volatile__

使用gcc编译的C代码中volatile__volatile__之间有什么区别?

我正在查看Linux源代码,我注意到有些地方使用__asm__ __volatile__其他人使用asm volatile而其他地方使用__asm__ volatile

我没有看到__volatile__没有使用__asm__ ,而我已经看到在各种其他地方使用的volatile

__volatile__volatile之间有什么区别吗? 如果是这样的话是什么? 或者,如果没有,有时使用__volatile__的原因是什么?

这仅用于向后兼容遗留代码。 加入到C在以后的生活中的关键词,如inlinevolatileasm等,有下划线前缀/后缀版本( __inline____asm____volatile__等),这样就可以在已经使用了朴实的名字遗留代码中使用作为类型/函数/变量/等等。 有一个命令行开关控制它, -ansi - 当你用gcc -ansi ...编译时gcc -ansi ...只识别这些较新关键字的下划线版本。

因为-ansi

虽然真正的-ansi程序不会使用asm(),但是即使程序本身是用-ansi构建的asm(),也需要有一种在头文件中包含asm宏的方法。 (使用-ansi ,gcc不包含与严格ISO C冲突的扩展名,如新关键字。)

asm需要一个正确命名空间的替代__asm__ ,它不能由系统在-ansi模式下定义。 现在,这对于volatile,并不是绝对必要的volatile,它长期以来一直是关键词,但也许是惯性,有人也(并且不必要地)使用__volatile__ (保留的系统名称格式)与volatile一起使用,即使程序会一直法律-ansi两种方式。

除了Paul R的回应;

鉴于您尚未定义以下任何名称:

  • asmvolatile语言关键字。 你怎么知道的? 它们之前或之后没有下划线,因此它们是该语言中的关键字。

  • _something_ (一个下划线)是保留的编译器关键字,类型,宏等。

  • __asm____volatile____whatever_else__ (两个下划线)是标准库中的关键字,宏等。

知道这一点将有助于您了解将来意味着什么,google什么以及在哪里找到对它们的引用。

__asm__是asm的替代品。 他们的意思是一样的。 我可以在GCC文档中找到相关信息。

对于volatile和__volatile, 12表示它意味着“如果你的汇编语句必须在你放置它的地方执行”。 但我浏览GCC文件3并没有找到这样的解释。 我不知道哪个答案也是正确的: 2中给出的答案或者Paul R.给出的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM