[解決済み] error: lvalue required as unary & operand
質問
コンパイル中(Linux Server リリース 6.1使用時)
strftime(AppTime, sizeof(AppTime),"%Y/%m/%d %T", localtime(&((long)u32_Time)));
エラー発生 "error: lvalue required as unary '&' operand"
しかし、同じコードが Red Hat Enterprise Linux AS リリース 3 で正常にコンパイルされました。
なぜそうなのでしょうか?どうすれば修正できますか?
どのように解決するのですか?
アドレス演算子
&
は、アドレスを取得するための変数を必要とします。キャストの結果
(long)u32_Time
は、必ずしもメモリ上に存在しないテンポラリであるため、取得可能なアドレスがありません。そのため、このコードがどこかでコンパイルされたことがあるとすれば、それは非標準のコンパイラ拡張である。
規格では、§5.3.1,3が要求しています。
単項演算子 & の結果は、オペランドへのポインタである。オペランドは、lvalue [...]でなければならない。
これを修正する方法
std::localtime
へのポインタを期待します。
std::time_t
ということで、それを提供するのがベストです。説明やさらなるコードは提供されていませんので、私は次のように推測することができます。
u32_Time
は4バイトの符号なし演算型であり、何らかの方法で時間を表現するものと思われる。それがどのように正しく変換され
std::time_t
は、コンパイラが後者をどのように実装しているか、さらにその値をどのように取得したかに依存します。単純にCキャストを適用すると
ではなく
へのキャストは移植可能であり
long
はさらにポータビリティに欠ける。
もし、もし、もし
その
std::time_t
現在お使いのプラットフォームで
と同じ表現で、符号なし32ビット型でもあります。
u32_Time
を使用すれば十分でしょう。
localtime(reinterpret_cast<std::time_t*>(&u32_Time));
よりポータブルなのは、最初に正しいデータ型に値を格納することでしょう。
std::time_t time = u32_Time;
localtime(&time);
このようにすると、以下のような場合に必要な警告やエラーが表示されます。
time_t
であり、その型は
u32_Time
は互換性がありません。
なぜなら、このコードを他のプラットフォームに移植しなければならなくなったとき、その厄介なキャストを簡単に見つける手段がなくなってしまうからです。
関連
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】'cout'は型名ではない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の