[英]GCC inline assembly - what's difference from __volatile__ and “memory”?
[英]Difference between volatile and __volatile__
使用gcc编译的C代码中volatile
和__volatile__
之间有什么区别?
我正在查看Linux源代码,我注意到有些地方使用__asm__ __volatile__
其他人使用asm volatile
而其他地方使用__asm__ volatile
。
我没有看到__volatile__
没有使用__asm__
,而我已经看到在各种其他地方使用的volatile
。
__volatile__
和volatile
之间有什么区别吗? 如果是这样的话是什么? 或者,如果没有,有时使用__volatile__
的原因是什么?
这仅用于向后兼容遗留代码。 加入到C在以后的生活中的关键词,如inline
, volatile
, asm
等,有下划线前缀/后缀版本( __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的回应;
鉴于您尚未定义以下任何名称:
asm
和volatile
是语言关键字。 你怎么知道的? 它们之前或之后没有下划线,因此它们是该语言中的关键字。
_something_
(一个下划线)是保留的编译器关键字,类型,宏等。
__asm__
, __volatile__
和__whatever_else__
(两个下划线)是标准库中的关键字,宏等。
知道这一点将有助于您了解将来意味着什么,google什么以及在哪里找到对它们的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.