問題タブ [c11]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 静的バッファーへのポインターを返す関数に関する C11 スレッド セーフ
localtime
(歴史的に) 静的バッファーへのポインターを返す C 標準ライブラリーのような関数を考えてみましょう。C11 はこれらのバッファをスレッドローカルにしますか?
C11 の 7.1.4 あたり:
以下の詳細な説明で特に明記されていない限り、ライブラリ関数は次のようにデータ競合を防止するものとします: オブジェクトが関数の引数を介して直接または間接的にアクセスされない限り、ライブラリ関数は現在のスレッド以外のスレッドによってアクセス可能なオブジェクトに直接または間接的にアクセスしてはなりません。 . オブジェクトが関数の非 const 引数を介して直接的または間接的にアクセスされない限り、ライブラリ関数は、現在のスレッド以外のスレッドによってアクセス可能なオブジェクトを直接的または間接的に変更してはなりません。オブジェクトがユーザーに表示されず、データ競合から保護されている場合、実装はスレッド間で独自の内部オブジェクトを共有できます。
例を考えてみましょうlocaltime
。struct tm
戻り値が指す は、呼び出し元がアクセスできるため、「内部オブジェクト」とは見なされないようです。そのため、別のスレッドで を呼び出しても、localtime
最初のスレッドで以前に返された結果が失われることはないようです。localtime
これは、スレッドごとに異なるバッファを使用する必要があることを意味します。
struct tm
ただし、アドレスが返されるオブジェクトの有効期間の終わりを標準が指定している場所はどこにもありません。呼び出し元のスレッドが終了した後もこれを使用し続けるプログラムが無効になる理由はわかりません。したがって、オブジェクトにスレッド ストレージ期間を指定することはできません。
実装がすべての要件を満たすことができることを確認できる唯一の方法は、いたるところでメモリをリークすることです。これは意図したことではありません。私は明らかな何かを見逃していますか、それともC11のレガシーインターフェースに関するスレッドセーフの扱いは本当に考え抜かれていますか?
c - typedefを介したC11匿名構造体?
C11標準で匿名構造体が追加されたので、
有効かつ標準です。完全な構造体宣言の代わりに typedef を使用することも標準内ですか? 例えば:
GCC のドキュメントによると、これは Plan 9 の拡張機能ですが、私が試したいくつかのコンパイラ (GCC を含む...) で動作します。標準自体を読む限り、問題ないと思います。
c - ビットフィールドとシーケンスポイント
f0
とf1
を同じバイトにパックする実装の場合、以下のプログラムは定義されていますか?
C99とC11の答えが違うと思う理由があれば興味があります。
C99 では、6.5:2 しか見つかりませんでした。
前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトに格納されている値は、式の評価によって最大 1 回変更されます。[...]
この段落が上記のプログラムにどのような影響を与えるかは、私には明確ではありません。
多数のランダム化されたテストに基づいて、ほとんどのコンパイラは、2 つの割り当てが干渉しないコードを生成するようです。
c - C11 の __STDC_VERSION__ 値は?
コンパイラは、コンパイラが標準 C であることを示すために使用することを知ってい__STDC__
ます。そこから、使用している標準のレベル__STDC_VERSION__
を把握するために使用できます。
また、C90には値がなく、C90修正1には値が199401L
あり、C99には値があったことも知ってい199901L
ます。
私が持っている最新の C1x ドラフトは、単にそれを述べており201ymmL
、最終的な標準では「あいまい」な値ではなくなったと思います。
私の推測では201112L
、C11 が批准されたのはそれ以降になると思いますが、確実にしたいと思います。
試してみようと思ったのですgcc -std=c1x
が、実行しているのバージョンでgcc
はまだサポートされていません。
実際の価値を知っている人はいますか?
c - 環境変数を変更する移植可能な方法はありますか?
C標準がgetenv()関数を定義していることに気付きましたが、(7.22.4.2)
環境リストを変更する方法は、実装によって定義されます。
私は自分のプログラムをできるだけ多くのホストされたC実装で動作させようとしていますが、実装に環境変数を設定するメソッドがあるかどうか、そのメソッドが何であるかを確認するための良い一般的な方法はありますか、それともそれを取る必要がありますか?ケースバイケースで?また、その引用の文言は、実装ごとにいくつかの方法が必要であることを私に示唆しています、その理解は正しいですか?
c - 配列/構造体を初期化するためのなじみのない構文、説明を探す
OVP (qemu に似た製品) という会社が提供する「プロセッサ モデリング ガイド」を参照しています。その中には、次のような小さなコード スニペットがあります。
このような構文は今まで見たことがありません。 C++ に関する無関係なものを削除
現時点では、彼らのものをダウンロード/見て、何かがどのように定義されているかを確認する能力がありません。したがって、私の質問です。この構文を認識している場合は、検討していただけますか?
編集
or1kDispatchTableC
は type のポインターの typedef ですが、or1kDispatchTableCP
何が何であるかについてはまだ何もありませんor1kDispatchTableCP
。
c - c11 _Generic 追加型
c11 _Generic 関数に追加の型を追加するにはどうすればよいですか?
それを #undef/re-#define する必要がありますか?(そうであれば、次のように動作します)、またはもっと良い方法がありますか?
c - C11での_Genericの構文と使用例
C11がジェネリックを追加したと聞きました。私は少しググって、いくつかの記事を見て、新しいキーワード(_Generic
)とすべてがあることを理解しました。しかし、私はそれをすべて把握することはできないようです。
それはC#のジェネリックやC ++のテンプレートのようなものですか?ジェネリックスのC11定義、その構文、および簡単なサンプルの使用例について簡単に説明してもらえますか?
c - C11 をサポートするコンパイラ
かなりの量の新しい C11 標準をサポートするコンパイラがあるかどうか疑問に思っていました。Generic Selection などの機能を探しています。
助言がありますか?
c - _Atomicタイプ指定子と修飾子の間のC11文法のあいまいさ
N1570をベースにしたC11用のlex/yacc文法を書き込もうとしています。私の文法のほとんどは、有益な構文の要約から逐語的にコピーされていますが、いくつかのyaccの競合が発生しました。1つを除いて、すべてを解決できました。「_ Atomic」を型指定子として使用する場合と、型修飾子として使用する場合との間には、あいまいさがあります。
指定子の形式では、_Atomicの直後に括弧が続くので、宣言子を括弧で囲むことができるCのあまり使用されていない構文と関係があると思います。これにより、括弧が修飾子の直後に続くようになります。しかし、私の文法は、typedef名を他の識別子と区別する方法をすでに知っているので、yaccはその違いを知っているはずですよね?
私の人生では、それが実際に曖昧になるケースを考えることはできません。
それが役立つとは思えませんが、yaccの-vフラグを使用したときに得られる関連する状態出力は次のとおりです。「ATOMIC」は明らかに「_Atomic」の私のトークン名です