yohhoyの日記

技術的メモをしていきたい日記

asmキーワードの扱いの違い

C言語C++言語とでは、それぞれの標準規格におけるasmキーワードの扱いが異なることに気付いたのでメモ。

結論を要約すると下記の通り。

  • Cでは予約語では無い。ただし、多くのシステムでは処理系定義であると言及。(informative)
  • C++では予約語であり、その構文を定義する。その意味は処理系定義と定める。(normative)

C言語でのasmキーワード

(C11のFCDである JTC1/SC22/WG14 N1570 を調査)
C言語ではasmキーワードは規格定義の本体ではなく、Annex J (informative) Portability issuesにて言及があるのみ。6.4.1 Keywordsでは、asmキーワードを予約語として定義しない。

J.5 Common extensions
The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming.

J.5.10 The asm keyword
The asm keyword may be used to insert assembly language directly into the translator output (6.8). The most common implementation is via a statement of the form:
 asm ( character-string-literal );

C++言語でのasmキーワード

C++11のFDISである JTC1/SC22/WG21 N3290 を調査*1
C++言語ではasmキーワードは予約語として定義され、その意味は処理系定義(implementation-defined)と明確に定義されている。

2.12 Keywords
The identifiers shown in Table 4 are reserved for use as keywords (that is, they are unconditionally treated as keywords in phase 7) except in an attribute-token (7.6.1) [ Note: The export keyword is unused but is reserved for future use. -- end note ]:
Table 4 -- Keywords
(表4に asm が記載されている)

7.4 The asm declaration [dcl.asm]
1 An asm declaration has the form asm-definition:
 asm ( string-literal ) ;
The asm declaration is conditionally-supported; its meaning is implementation-defined. [ Note: Typically it is used to pass information through the implementation to an assembler. -- end note ]

*1:ISが発行されるとFDISはアクセス不可となるルールだそう。1つ前のWDである N3242 は公開されている。