したがって、C のいくつかの変数から constness を削除する必要があります (自分が何をしているのかはわかっています)。UNCONST
そこで、const 値に新しい値を代入できる小さなマクロ ( ) を書きました。これは、 のような型の通常の変数に対しては問題なく機能しますint
。しかし、これはポインターには機能しません。そのため、マクロUNCONST
を使用してポインタが別の位置を指すようにすることはできません。コンパイラの警告が表示されます。
ここに小さなテストプログラムがありunconst.c
ます:
#include <stdio.h>
#define UNCONST(type, var, assign) do { \
type* ptr = (type*)&(var); \
*ptr = (assign); \
} while(0)
struct mystruct {
int value;
char *buffer;
};
int main() {
// this works just fine when we have an int
const struct mystruct structure;
UNCONST(int, structure.value, 6);
printf("structure.value = %i\n", structure.value);
// but it doesn't when we have an char *
char *string = "string";
UNCONST(char *, structure.buffer, string);
printf("structure.buffer = %s\n", structure.buffer);
// this doesn't work either, because whole struct is const, not the pointer.
structure.buffer = string;
printf("structure.buffer = %s\n", structure.buffer);
}
コンパイルと実行
$ LANG=en gcc -o unconst unconst.c
unconst.c: In function ‘main’:
unconst.c:21:3: warning: assignment discards ‘const’ qualifier from pointer target type [enabled by default]
unconst.c:25:3: error: assignment of member ‘buffer’ in read-only object
この警告が表示されないようにマクロを最適化する方法はありますか?