5

用 gcc 编译的 C 代码volatile和in 有什么区别?__volatile__

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

我没有见过__volatile__used without __asm__,而我见过volatile在其他各种地方使用过。

__volatile__做什么和做什么有区别volatile吗?如果是这样,那是什么?__volatile__或者,如果没有,有时是否有理由使用?

4

4 回答 4

10

这只是为了向后兼容遗留代码。在后来的生活中添加到 C 中的关键字,例如inline, volatile,asm等,具有下划线前缀/后缀版本(__inline__, __asm__,__volatile__等),以便您可以在已经使用朴素名称作为类型/函数/变量的遗留代码中使用它们/任何。有一个命令行开关可以控制这一点,-ansi- 当您gcc -ansi ...仅使用这些较新关键字的下划线版本进行编译时,会被识别。

于 2013-01-07T22:10:33.143 回答
4

因为-ansi

尽管-ansi不会使用真正的程序,asm(),但即使程序本身是用-ansi. (使用-ansi,gcc 不包括与严格 ISO C 冲突的扩展,例如 new 关键字。)

需要一个适当命名空间的替代方案__asm__asm但系统无法在-ansi模式下定义它。现在,这并不是严格必要的volatile,,长期以来一直是关键字,但也许由于惯性,有人也(并且不必要地)做了一个__volatile__(保留的系统名称格式)来使用volatile,即使该程序也是合法-ansi的方式。

于 2013-01-07T22:19:14.960 回答
2

除了 Paul R 的回应;

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

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

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

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

了解这一点将帮助您了解未来事物的含义、谷歌搜索的内容以及在哪里可以找到对它们的引用。

于 2013-01-07T22:20:33.310 回答
0

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

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

于 2014-02-08T07:56:15.807 回答