#include <stdio.h>
struct X
{
int a;
char c[10];
short d;
};
char checker(int a)
{
(void)a;
return '1';
}
#define STRINGIFY(x) #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 9 天前
哪些编译器可以
|
2
Exxfire OP @pipapa 我用的 gcc 编译,其它没试。gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
|
3
henix 9 天前
在 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 9 天前
有什么用吗
|
5
csfreshman 9 天前
没什么用,执行和 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 8 天前 via Android
|