Если немного подумать о том, что вы просите компилятора сделать здесь, вы, вероятно, поймете, что то, что вы просите, нереально.
Чтобы компилятор выяснил, что sizeof(name_bins[1].data)
равен 11
, он должен убедиться, что каждый возможный путь, ведущий к строке кода, содержащей sizeof
, имеет точно такое же состояние, когда он приходит к name_bins[1].data
объекту.
В приведенном вами простом примере вы можете ожидать, что компилятор сможет каким-то образом это выяснить. Но что, если ваше приложение станет более сложным? Как компилятор узнает, что name_bins[1].data
все еще содержит "\xFF\x0A\x00\x33\x01\x01\x03\x04\x04\x05"
?
РЕДАКТИРОВАТЬ : Следуя комментариям, вы можете создать новый тип, который будет содержать как данные, так и размер:
typedef struct ConstByteString {
const unsigned char* data;
size_t length;
} ConstByteString;
, а затем используйте это:
struct name_data {
const char* name;
ConstByteString data;
} name_bins [] = {
{ "John", { "\xAA\xAA\x00\xAA", sizeof("\xAA\xAA\x00\xAA") } },
{ "Mark", { "\xFF\x0A\x00\x33\x01\x01\x03\x04\x04\x05", sizeof("\xFF\x0A\x00\x33\x01\x01\x03\x04\x04\x05") } },
};