
#include <stdio.h> struct X { int a; char c[10]; short d; }; char checker(int a) { (void)a; return '1'; } #define STRINGIFY(x) # #define TOSTRING(x) STRINGIFY(x) #define TEST(x) \ do \ { \ char checkSizeOfInt[sizeof(x)] = {checker(&checkSizeOfInt)}; \ _Pragma(TOSTRING(message("Value: " #x))) \ } while (0); int main() { TEST(struct X); return 0; } 1 pipapa 292 天前 哪些编译器可以 |
2 Exxfire OP @pipapa 我用的 gcc 编译,其它没试。gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) |
3 henix 292 天前 在 gcc 14 上修改之后会输出这些: test.c: In function 'main': test.c:21:51: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 21 | char checkSizeOfInt[sizeof(x)] = {checker((int)&checkSizeOfInt)}; \ | ^ test.c:26:5: note: in expansion of macro 'TEST' 26 | TEST(struct X); | ^~~~ test.c:22:9: note: '#pragma message: Value: struct X' 22 | _Pragma(TOSTRING(message("Value: " #x))) \ | ^~~~~~~ test.c:26:5: note: in expansion of macro 'TEST' 26 | TEST(struct X); | ^~~~ 没看到什么结构体大小啊 |
4 open9527 292 天前 有什么用吗 |
5 csfreshman 292 天前 没什么用,执行和 3 楼一样 |
6 Exxfire OP @henix var_para_num_test.c: In function ‘main’: var_para_num_test.c:21:51: warning: passing argument 1 of ‘checker’ makes integer from pointer without a cast [-Wint-conversion] char checkSizeOfInt[sizeof(x)] = {checker(&checkSizeOfInt)}; \ ^ var_para_num_test.c:26:5: note: in expansion of macro ‘TEST’ TEST(struct X); ^ var_para_num_test.c:9:6: note: expected ‘int’ but argument is of type ‘char (*)[16]’ char checker(int a) ^ var_para_num_test.c:26:17: note: #pragma message: Value: struct X TEST(struct X); ^ var_para_num_test.c:21:36: note: in definition of macro ‘TEST’ char checkSizeOfInt[sizeof(x)] = {checker(&checkSizeOfInt)}; |
7 yolee599 291 天前 via Android |