volatile和__volatile__之间的区别

时间:2013-01-07 22:07:26

标签: c gcc volatile

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

我在查看Linux源代码时发现有些地方使用__asm__ __volatile__其他地方使用asm volatile而其他地方使用__asm__ volatile

我没有看到__volatile__在没有__asm__的情况下使用,而我看到volatile在其他地方使用过。

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

由于-ansi

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

__asm__需要正确命名空间的替代asm,而系统无法在-ansi模式下对其进行定义。现在,volatile,长期以来一直是一个关键词,这并不是绝对必要的,但也许是惯性,也有人(并且不必要地)制作了__volatile__(保留的系统名称格式) volatile,即使该计划在任何一种情况下都是合法的-ansi

答案 2 :(得分:2)

除了Paul R的回应之外;

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

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

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

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

了解这一点将有助于您了解未来的意义,谷歌的内容以及在哪里找到它们的参考。

答案 3 :(得分:0)

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

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