我的代碼:
union FIELD {
int n;
char c;
const char *s;
FIELD(){}
FIELD(int v){ n = v; }
FIELD(char v){ c = v; }
FIELD(const char* v){ s = v; }
};
struct SF {
const char* s0;
char s1;
int s2;
const char* s3;
};
int main() {
printf("sizeof(long) = %ld\n", sizeof(long));
printf("now is %d bit\n", sizeof(long) == 8?64:32);
FIELD arrField[] = {
FIELD("any 8 words 0 mixed"), FIELD('d'), FIELD(251356), FIELD("edcba")
};
SF* sf0 = (SF*)&arrField;
printf("sf0->s0 = %s, ", sf0->s0);
printf("sf0->s1 = %c, ", sf0->s1);
printf("sf0->s2 = %d, ", sf0->s2);
printf("sf0->s3 = %s\n", sf0->s3);
}
當我使用默認的 64 位執行輸出時:

我在以下位置添加編譯引數CMakeLists.txt:
set_target_properties(untitled PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
它將編譯 32 位程式,然后運行并輸出:

我的問題是,如何使 64 位程式具有與 32 位程式相同的輸出行為?
uj5u.com熱心網友回復:
適用alignas(FIELD)于 的每個成員變數SF。
此外,您不能依靠long64 位和 32 位系統設備的大小來區分。檢查指標的大小以執行此操作。在某些 64 位系統上long是 32 位。例如,我的系統就是這種情況。
此外,%ld需要一個long引數,但sizeof運算子產生size_t的結果是無符號的,而且大小不一定匹配long。您需要在此處添加一個強制轉換以確保安全(或者只是std::cout根據運算子的第二個運算元自動選擇正確的轉換<<)。
union FIELD {
int n;
char c;
const char* s;
FIELD() {}
FIELD(int v) { n = v; }
FIELD(char v) { c = v; }
FIELD(const char* v) { s = v; }
};
struct SF {
alignas(FIELD) const char* s0;
alignas(FIELD) char s1;
alignas(FIELD) int s2;
alignas(FIELD) const char* s3;
};
int main() {
printf("sizeof(long) = %ld\n", static_cast<long>(sizeof(long)));
printf("now is %d bit\n", static_cast<int>(sizeof(void*)) * 8);
FIELD arrField[] = {
FIELD("any 8 words 0 mixed"), FIELD('d'), FIELD(251356), FIELD("edcba")
};
SF* sf0 = (SF*)&arrField;
printf("sf0->s0 = %s, ", sf0->s0);
printf("sf0->s1 = %c, ", sf0->s1);
printf("sf0->s2 = %d, ", sf0->s2);
printf("sf0->s3 = %s\n", sf0->s3);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454373.html
