C volatile和_volatile之间的差异__

C volatile和_volatile之间的差异__,c,gcc,volatile,C,Gcc,Volatile,在用gcc编译的C代码中,volatile和\uuuuuu volatile\uuuuuu之间有什么区别 我查看了Linux源代码,发现有些地方使用\uuuasm\uuuuuu volatile\uuuuu其他地方使用asm volatile,其他地方使用\uuuasm\uuuvolatile 我没有看到在没有\u asm\u的情况下使用\u volatile\u,而我看到volatile在许多其他地方使用 \uuuu volatile\uuuu和volatile之间有什么区别吗?如果是,是什么

在用gcc编译的C代码中,
volatile
\uuuuuu volatile\uuuuuu
之间有什么区别

我查看了Linux源代码,发现有些地方使用
\uuuasm\uuuuuu volatile\uuuuu
其他地方使用
asm volatile
,其他地方使用
\uuuasm\uuuvolatile

我没有看到在没有
\u asm\u
的情况下使用
\u volatile\u
,而我看到
volatile
在许多其他地方使用


\uuuu volatile\uuuu
volatile
之间有什么区别吗?如果是,是什么?或者,如果没有,是否有理由有时使用
\uuuuuu volatile\uuuu
。后来添加到C中的关键字,如
内联
volatile
asm
,等等,都有下划线前缀/后缀版本(
\uuuuuuuu内联
\uuuuu asm\uuuuu
\uuuuu volatile\uuuu
,等等)这样,您就可以在已经使用未经修饰的名称作为类型/函数/变量/任何内容的遗留代码中使用它们。有一个命令行开关控制此操作,
-ansi
-当您使用
gcc-ansi…
编译时,仅识别这些较新关键字的下划线版本。

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


asm
需要一个正确命名的备选方案
\uuu asm\uuuu
,系统无法在
-ansi
模式下定义该方案。现在,对于
volatile,
这已经是一个关键词很长一段时间了,这并不是严格必要的,但可能是由于惯性,有人也(不必要地)制作了一个
\uuuuuuuvolatile\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(保留系统名称格式)来与
volatile<,即使该程序在任何情况下都是合法的

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

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

  • \u某物
    (一条下划线)是保留的编译器关键字、类型、宏等

  • \uuuuu asm\uuuuuuu
    \uuuuuu volatile\uuuuuuu
    \uuuuuuuuu其他任何东西(两个下划线)是标准库关键字、宏等


了解这一点将有助于你了解未来事物的含义、对谷歌的意义以及在何处找到对它们的引用。

\uuu asm\uuuu
是asm的替代方案。他们的意思是一样的。我可以在GCC文档中找到相关信息


对于volatile和uu volatile,它的意思是“如果您的汇编语句必须在您放置它的地方执行”。但我浏览了GCC文档,却找不到这样的解释。我也不知道哪个答案是正确的:中给出的答案或Paul R给出的答案。

非标准关键字必须使用前导下划线。但这条规则加入到语言中太晚了,编译器无法在不破坏大量现有代码的情况下放弃非标准用法;现在的趋势是定义新的语言关键字,并使用前导下划线和标题大小写(
\u Bool
\u Alignof
),并提供小写变量作为宏(
Bool
Alignof
);标准宏是大写的,由两个下划线包围(
\uuuuu FILE\uuuuu
\uuuuu STDC\u VERSION\uuuuu
);还有一些特殊情况(
\uuuuu func\uuuu
-它不是宏,而是预定义的标识符,
\uuuuuu alignof\u是定义的
,它是宏);编译器和libc可以自由地做任何他们想做的事情,但当然应该遵循ISO指定的保留标识符规则standard@Christoph,你是对的,这些都不是事实,只是通常非常普遍,因此在试图找出某件事是什么的时候,它们是一种帮助。但你还是对的。如果你想知道全部真相,那就太糟糕了:不过这并不能解释
\uuuuuuuuuuuuuuuuuvolatile\uuuuuuuuuuu
;我猜这可能与禁止在Linux内核中使用
volatile
类型限定符的规则有关。。。