使用gcc编译的C代码中volatile
和__volatile__
之间有什么区别?
我在查看Linux源代码时发现有些地方使用__asm__ __volatile__
其他地方使用asm volatile
而其他地方使用__asm__ volatile
。
我没有看到__volatile__
在没有__asm__
的情况下使用,而我看到volatile
在其他地方使用过。
__volatile__
和volatile
之间有什么区别吗?如果是这样的话是什么?或者,如果没有,有时会使用__volatile__
吗?
答案 0 :(得分:8)
这只是为了与遗留代码向后兼容。在以后生活中添加到C的关键字,例如inline
,volatile
,asm
等,都有下划线前缀/后缀版本(__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的回应之外;
鉴于您尚未定义以下任何名称:
asm
和volatile
是语言关键字。你怎么知道的?它们之前或之后没有下划线,因此它们是语言中的关键字。
_something_
(一个下划线)是保留的编译器关键字,类型,宏等。
__asm__
,__volatile__
和__whatever_else__
(两个下划线)是标准库关键字,宏等。
了解这一点将有助于您了解未来的意义,谷歌的内容以及在哪里找到它们的参考。
答案 3 :(得分:0)