質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1779閲覧

[C++] 非inline関数を定義後,inlineとして再宣言する

THE_1987

総合スコア7

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2020/01/20 15:25

規格案N4842を読んでいてよくわからなかったので質問させてください.

9.2.7 The inline specifier にて,

"If a definition of a function or variable is reachable at the point of its first declaration as inline,
the program is ill-formed."

とありますが,この文章が意味することがよくわかりません.
表題「非inline関数の定義後,それをinlineとして再宣言する」のようなことができないことを指しているのかな?
と思い以下のコードを書いてみましたがエラーは出ませんでした.

どなたかわかる方,ご教授いただけるとありがたいです.

C++

1void f(){}; // 非inline関数として定義 2inline void f(); // inline関数として再宣言,エラー出ず 3 4int main() 5{ 6 f(); 7 return 0; 8}

実行環境

GCC 9.2.0
オプション引数: -std=c++17

LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問者の理解で正しいと思います。

しかし、もう少し読み進めると no diagnostic is required (NDR と略されることが多いです) という文言もあり、これはコンパイル時に診断結果、つまりはエラーかどうかを判定して示さなくてもよい (もちろんしても良いですが) ことを意味し、エラーを出さない処理系でも規格準拠と言えるのです。

GCC だとエラーを出しませんが、 Clang だとエラーになるようです。

コンパイル時にエラーを出さなかったとしても結果が未定義であることにはかわりないので、やるべきではないです。

投稿2020/01/20 16:04

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

THE_1987

2020/01/22 11:38

"no diagnostic is required" を見落としていました. >> GCC だとエラーを出しませんが、 Clang だとエラーになるようです。 調べてくださってありがとうございます, Clangでコンパイルしたところちゃんとエラーにしてくれました.
guest

0

「gcc inline」でぐぐると解説が出てきます

inlineというのはインライン展開を指示するものですが、事情によりinline出来ない場合は単にその指示は無視されます
提示のコードでは、すでに関数呼び出しとして定義されたあとであるため、再定義のinlineは無視されますね

投稿2020/01/20 15:58

編集2020/01/20 16:03
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問