問題タブ [gnu99]
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 - ステートメント式の「再定義」変数は安全ですか?
私の質問は、 GNUCの拡張機能として追加されたステートメント式に関するものです。次のコードについて考えてみます。
コンパイル(gcc -Wall -std=gnu99 lala.c -o lala
)して実行すると、次のようになります。
container_of
この方法(拡張機能の使用)は、特にLinuxカーネルではかなり一般的です。
この場合と同様に、ローカル変数を宣言してそれを使って何かを行うマクロを定義したいと思います。ただし、現在のスコープで使用可能な変数名を汚染せずにこれを実行し、再定義の可能性を回避したいと思います。再定義の場合にスコープがどのように正確に発生するかについてのドキュメント情報を見つけることができませんでした。
上記の場合、再定義に関してコンパイラから警告は発行されません。私の質問は、ステートメント式の内部でスコープされた変数が外部スコープの同じ名前の変数に影響を与えないという事実に頼ることができるかどうかです。
linux - なぜC99はストレージサイズについて不平を言うのですか?
これは私がLinuxでコンパイルしているコードです:
gcc test.c
結構です。
gcc -std=gnu99 test.c
結構です。
gcc -std=c99 test.c
次のエラーで失敗します:
struct ifreq
Linuxでの定義が気に入らないC99の違いは何ですか?
c - gnu99 をサポートする gcc で「警告: インライン関数 `*stat64` が宣言されていますが、定義されていません」に対処する方法
私は次のようstat.h
に私の中に含めてfoo.c
います:
これを次のようにコンパイルすると:
<sys/stat.h>
関数に固有の次の警告が表示されます。
これらの警告で言及されている問題を修正するにはどうすればよいですか? で C99 サポートに移行するまで、これは問題ではないように思われましたが、-std=gnu99
その理由はわかりません。アドバイスをありがとう。
c - C のビット単位の「not」演算子は符号付きの結果を返します
次のコードを検討してください。
出力は次のとおりです。
0 1 1 1
GCC は次の警告をスローしますa == ~ ( uint16_t ) 0
。
データ型の範囲が制限されているため、比較は常に false [-Wtype-limits]
ビットごとの「not」演算子が符号付きの値を返そうとしているのはなぜですか? どうすればそれを防ぐことができますか?
c - カーネルモジュールをコンパイルするのに c99 ではなく gnu99 を使わなければならないのはなぜですか?
私は-std=c99
、アプリケーション コードをコンパイルするときに c99 機能を有効にするために使用することに慣れています。
最近、いくつかの基本的なカーネル モジュールの例に従ってccflags-y := -std=c99
、makefile に追加しました。ただし、これを作成しようとすると、17K 行のエラーが発生しました。gnu99
完璧に動作します。
カーネルコードが依存している gnu99 と c99 の違いは何ですか?
c - NetBSD の libmagic close ファイル記述子
私は、Web プロバイダーの静的コンテンツに zlib 圧縮を提供するための FastCGI を作成していますがmmap()
、NetBSD で問題が発生しています。
デバッグのために fastCGI 関数を printf()/scanf() にすると、NetBSD で次のようになります。
圧縮機: errno=9: mmap のマニュアル ページで次のように説明されている EBADF に対応する不正なファイル記述子fd is not a valid open file descriptor
。fstatとlibmagicで動作するため、ファイル記述子は私にとってかなり有効であるように思われるため、これはわかりません。sshfs を介して NetBSD ファイルシステムをマウントし、Linux 用のコードをコンパイル/実行すると、次のようになりました。
これは、同じコードが変更なしで Linux で動作することを意味します。
追加情報:
- NetBSD では uname -a が返されます
NetBSD odin 6.1.2 NetBSD 6.1.2 (GENERIC) amd64
- Linux では uname -a が返されます
Linux localhost.localdomain 3.16.0-rc7-ck2 #1 SMP Fri May 1 13:38:34 CEST 2015 x86_64 GNU/Linux
- gcc-4.5.3 は NetBSD のコンパイラーのバージョンです
- gcc-4.9.2 は Linux のコンパイラ バージョンです。
- 両方のアーキテクチャは同じであり、両方のコンパイラはすべての最適化を無効にして同じ汎用フラグを使用します。
アップデート
不明な理由magic_descriptor()
で、NetBSD でファイル記述子を閉じているようで、実際に次の単純なコードが機能しません: