typedef enum
{
eval1,
eval2,
eval3
} enum_t;
_Static_assert(sizeof(enum_t) == 1, "enum_t must be 1 byte");
char dummy[sizeof(enum_t) == 1];
如果注釋掉,則此代碼編譯_Static_assert。編譯的事實dummy應該意味著sizeof(enum_t) == 1評估為真。
為什么我的_Static_assert不作業?
其他情況:
_Static_assert(sizeof(enum_t) >= 1, ""); // Passes
_Static_assert(sizeof(enum_t) == 1, ""); // Fails
_Static_assert(sizeof(enum_t) > 1, ""); // Fails
_Static_assert(!(sizeof(enum_t) > 1), ""); // Fails
我正在使用 clang 13.0.0。
我的命令列是:“C:/Program Files/SEGGER/SEGGER Embedded Studio for ARM 5.68/llvm/bin/clang”-cc1 -disable-free -disable-llvm-verifier -fgnuc-version=4.2.1 -mrelocation -model static -mconstructor-aliases -xc -fno-caret-diagnostics -fno-diagnostics-fixit-info -std=c17 -triple thumbv6m-none-eabi -target-cpu cortex-m0 -target-feature strict-align -目標特征 soft-float -target-feature soft-float-abi -msoft-float -target-abi aapcs -mfloat-abi soft -fno-signed-char -fallow-half-arguments-and-returns -mllvm - arm-global-merge=false -nostdsysteminc -nobuiltininc "-isystemC:/Program Files/SEGGER/SEGGER Embedded Studio for ARM 5.68/segger-rtl/include" "-isystemC:/Program Files/SEGGER/SEGGER Embedded Studio for ARM 5.68 /包括”-D__SIZEOF_WCHAR_T = 4 -D__ARM_ARCH_6M__ -D__SES_ARM -D__HEAP_SIZE __ = 0 -D__SES_VERSION = 56800 -D__SEGGER_LINKER -DDEBUG = 1 -DUSE_RTT = 1 -DSTM32G031xx -D__STM32G0xx_FAMILY -D__STM32G031_SUBFAMILY -DARM_MATH_CM0PLUS -sys頭-DEPS -Werror -dwarf版本= 4 -debug -info-kind=standalone -debug-info-macro -debugger-tuning=gdb -mllvm -generate-arange-section -exception-model=dwarf -gpubnames -fno-dwarf-directory-asm -fmath-errno -ffunction-sections -fdata-sections -fshort-enums -fno-common test.c -emit-obj -o test.o -Wall -Wextra -Wpedantic -ffunction-sections -fdata-sectionso -Wall -Wextra -Wpedantic -ffunction-sections -fdata-sectionso -Wall -Wextra -Wpedantic -ffunction-sections -fdata-sections
uj5u.com熱心網友回復:
一些編譯器接受 0 長度陣列。例如,在 Godbolt.org 上測驗 GCC 11.2,我們可以看到 GCC 很高興地編譯了一個長度為 0 的陣列,并且只有在-pedantic使用該選項時才會發出警告。
因此,您不應該僅僅因為char foo[x];編譯就認為這x是積極的。如果您不想使用_Static_assert,而是出于某種原因想要使用陣列大小??進行斷言,您可以執行以下操作:
char foo[condition ? 1 : -1];
uj5u.com熱心網友回復:
C 標準規定每個列舉型別應與 char、有符號整數型別或無符號整數型別兼容 - 并且型別的選擇是實作定義的。(ISO/IEC 9899:2018 6.7.2.2 4)
因此,通常,在 C 中,anenum是一種integer型別,而不是 a char,所以我期望:
sizeof(enum_t) == sizeof(int)
因此,對于典型的 32 位系統,sizeof(int)是 4 - 我懷疑這就是你所看到的......
一些編譯器確實有一個語言擴展,允許您指定列舉型別的大小......已經討論了標準化這一點,但它不在 C18 中,也不是(還!)C2X 的候選者。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418554.html
標籤:
