[過去ログ] C言語なら俺に聞け 151 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
512
(4): デフォルトの名無しさん (オッペケ Sr8b-lJiK) [sage] 2019/05/14(火) 06:41:01.67 ID:7SLYc+Rqr(1/2) AAS
OSSで構造体を公開しようとおもってる

そのサイズをバージョンアップしても固定にしたいんだけどいいアイデアないかな?
struct foo {
int a;
double b; // ここをバージョンアップで追加
}

char[100] buffer;

上記を予め含めておいて、追加サイズ分だけ減らすってのがよくある手段だと思うけど、intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
パディングでサイズも変わっちゃうしね

C++ならテンプレートでいけるけど、OSSだから利用者が多いC言語で書いておく必要がある
構造体を公開しないで、ハンドラとセッタで扱えばいけるだろうけど、今回は構造体でいきたい
514
(2): デフォルトの名無しさん (アークセー Sx8b-Vhni) [sage] 2019/05/14(火) 08:07:10.74 ID:0o/9QF7Tx(1) AAS
>>512
処理系によるパディングとかの問題を別にしたら、bufferをunionにしといたらわざわざ減らさなくても良いのでは?
518: デフォルトの名無しさん (ワッチョイ ff69-PnGR) [sage] 2019/05/14(火) 13:59:44.65 ID:d9/Wmgv60(2/2) AAS
構造体の大きさが char[100] に収まってる範囲での話
>>512 のように末尾に用意したギャップを引き算していくにしても、引ききれなくなった段階で破綻するよね

※ 突破したことをチェックするには sizoef(union foo) と sizeof(char[100]) とを比較すんのかなぁ…
523
(1): デフォルトの名無しさん (ワッチョイ bf54-vVMj) [sage] 2019/05/14(火) 21:12:50.85 ID:8soz04JH0(1) AAS
>>512

不格好だけどこれでいけるよ
全部プリプロセッサで処理できて、構造体サイズは100バイト固定になる。
予想を超えてサイズを突き破った場合は別構造体作るしかないね。

#include <stddef.h>

struct inner_foo {
int a;
char buf[];
};

#define MAX_STRUCT_SIZE 100
#define BUF_SIZE (MAX_STRUCT_SIZE - offsetof(struct inner_foo, buf))

struct foo {
int a;
double b;
char buf[BUF_SIZE];
};
535
(1): デフォルトの名無しさん (ワッチョイ 9ff9-vVMj) [sage] 2019/05/15(水) 12:59:51.65 ID:Wbf0zcGJ0(1/2) AAS
exeがnew(malloc)するけど中をいじるのは全てdllの関数ってのはままある
dllだけ差し替えで済ましたい、サイズが変わらなければexeはビルドし直さなくていいのに…
ってことだろう

>512
>intや他の型が固定サイズの保証はないから、処理系をかんがえると使えない
>パディングでサイズも変わっちゃうしね
は全く関係ない話だったということだ

素直に「よくある手段」でやればいい

>514,517のunionもいいと思うけど
foo.aでアクセスできないよね?foo.body.aとかしないと
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.044s