2

汎用バッファ .c/.h ファイルを使用しています。com バッファーとして使用するために、volatile として修飾されたインスタンスを作成したいと考えています。

次のコードは問題を示しています。修飾子が失われていますか?? バッファアドレスをメンバー関数に渡すとき。

コード セグメントでは、「const」修飾子を例として使用しています。「volatile」も同じように動作すると想定しています。Rowley ARM GCC コンパイラの使用。

typedef struct buff_t {
  char buffchar;
  int index;
  }buff;

void buff_init( buff *thisbuff ) {
  thisbuff->buffchar = 'x';
  thisbuff->index = 0;
  }


int main(void)
{

  buff memBuffer;
  buff const UARTBuffer;
  buff *buff_ptr;

  buff_ptr = &memBuffer;
  buff_init( buff_ptr );          /* struct elements initialized as expected */

  // UARTBuffer.buffchar = 'y';   /* this caught by compiler as error to read-only object */
  buff_ptr = &UARTBuffer;         /* compile warning: assignment discards 'const' qualifier from pointer target type */
  buff_init( buff_ptr );          /* UARTBuffer elements also initialized, expected const??? */

}
4

2 に答える 2

2

コードはポインターを介して構造体オブジェクトを変更しようとするため、 Undefined Behavior(UB)constを呼び出します 。つまり、無効なコードです。このようなシナリオを回避する唯一の方法は、UB を呼び出すコードを記述しないことです。 コンパイラは、そのようなコードを書くことを許可し、自分の足 (むしろ顔) を撃つことを許可することに注意してください。銃を持っている場合は、慎重に使用する責任があります。

変数をマークするには、プログラムの場合と同様に、宣言中にvolatileキーワードを追加する必要があります。volatileconst

于 2012-05-16T04:40:53.580 に答える
2

修飾子は、各ポインターの個別のプロパティです。

オブジェクトがconstであり、それへの非constポインターを取得した場合、ポインターは作成されませんconst。コンパイラが警告するか、書き込もうとしてクラッシュする可能性があります ( には関係volatileありません) が、ポインタは として扱われませんconst

あなたの場合、buff_ptrbuff_initの両方thisbuffに修飾子が必要です。

于 2012-05-16T04:42:24.907 に答える