Дублирование константы case
- это уловка, которая гарантированно работает ВО ВСЕХ КОМПИЛЯТОРАХ C, независимо от того, как каждый из них сообщает об ошибке. Для Visual C ++ это просто:
struct X {
int a,b;
int c[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
int dummy;
switch (dummy) {
case sizeof(X):
case sizeof(X):
break;
}
return 0;
}
Результат компиляции:
------ Build started: Project: cpptest, Configuration: Debug Win32 ------
cpptest.cpp c:\work\cpptest\cpptest\cpptest.cpp(29): error C2196: case value '48' already used
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Таким образом, размер структуры X равен 48
EDITED (3jun2020): для gcc или любых других компиляторов, которые выводят только «повторяющееся значение регистра», я использую этот трюк, чтобы сузить значение:
1) добавьте значение case 1 == 2 (для представления false)
2) методом проб и ошибок сузьте значение, например Я пытаюсь угадать, что sizeof(X)
> 16:
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
case 1==2:
case sizeof( X)>16:
//case 16:
break;
}
return 0;
}
результат:
main.c: In function ‘main’:
main.c:14:5: error: duplicate case value
case sizeof( X)>16:
^~~~
main.c:13:5: error: previously used here
case 1==2:
так что это ложь, т.е. sizeof (X) ‹= 16.
3) повторить с некоторыми другими разумными ценностями. например попробуйте угадать, что это 16, т.е. sizeof(X)==16
. Если он не жалуется на повторяющееся значение case. Тогда выражение верное.
4) при желании добавьте case 16
, чтобы проверить это, например.
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
// case 1==2:
case sizeof( X):
case 16:
break;
}
return 0;
}
результат
main.c: In function ‘main’:
main.c:15:5: error: duplicate case value
case 16:
^~~~
main.c:14:5: error: previously used here
case sizeof( X):
подтверждающий, что sizeof (X) равен 16.
В качестве альтернативы замечено, что gcc может сообщать о нескольких дубликатах, поэтому этот трюк возможен для выполнения нескольких предположений за один проход:
#include <stdio.h>
typedef struct _X {
int a;
char b[10];
} X;
int main()
{
printf("Hello World");
int dummy=0 ;
switch (dummy) {
case 1==2: //represents false
case 1==1: //represents true
case sizeof( X)>10:
case sizeof( X)>12:
case sizeof( X)>14:
case sizeof( X)>16:
case sizeof( X)==16:
//case 16:
break;
}
return 0;
}
результат
main.c: In function ‘main’:
main.c:14:5: error: duplicate case value
case sizeof( X)>10:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:15:5: error: duplicate case value
case sizeof( X)>12:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:16:5: error: duplicate case value
case sizeof( X)>14:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
main.c:17:5: error: duplicate case value
case sizeof( X)>16:
^~~~
main.c:12:5: error: previously used here
case 1==2:
^~~~
main.c:18:5: error: duplicate case value
case sizeof( X)==16:
^~~~
main.c:13:5: error: previously used here
case 1==1:
^~~~
предполагая, что sizeof(X)
> 10,> 12,> 14, но не> 16. == 16 добавляется в качестве окончательного предположения.
person
JavaMan
schedule
09.05.2016
sizeof
оценивается во время компиляции). - person mafso   schedule 08.01.2014sizeof
. Это оператор, а не функция. - person mafso   schedule 08.01.2014pahole
для конечных исполняемых или объектных файлов. (Или даже с помощью objdump --dwarf) - person nos   schedule 08.01.2014objdump --dwarf
на небольшой структуре, и это показалось неточным. Я должен вернуться, чтобы увидеть, что я сделал не так. - person altendky   schedule 08.01.2014typedef
'присваивая типу массива положительный (подтверждение пройдено) или отрицательный (утверждение не удалось) размер. Это ничего не делает с препроцессором, поэтому#if
не работает с ним. Тем не менее, что я сделал, так это создал группу утверждений, работающих с#define
, которые я мог указать на интересующую структуру. - person altendky   schedule 08.01.2014