- 1
#define SOME_MACRO_NAME 4 /* 1 */
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+127
#define SOME_MACRO_NAME 4 /* 1 */
+136
//...
float a = 7;
printf("%d", *(unsigned int *)(&a) >> 23);
// Что напечатает?
//...
На экзамене как-то задали такой вопрос. А ну-ка, кто без компилятора ответит?
+116
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%s\n", NULL);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main() {
const char str[] = "%s\n";
printf(str, NULL);
return 0;
}
Эквивалентные программы такие эквивалентные. А всё из-за printf optimization в GCC.
Стандарт, кстати, разрешает, потому что это UB.
Вообще пора создать ub.govnokod.ru и складывать туда примеры разного поведения на каждое UB из стандарта.
+131
#include <stdio.h>
#include <stdlib.h>
/*
Declare array of functions that return array of functions with
one parameter - function accepting array of functions returning
a pointer to function void(void). No typedefs.
Decoded to the following:
1) An array of E.
2) E = a function that takes void and returns an array of D (returns an array taken to mean a pointer to D).
3) D = a function that takes C and returns void.
4) C = a function that takes an array of B and returns void.
5) B = a function that takes void and returns A.
6) A = a pointer to void(void).
*/
/* Using typedefs */
typedef void (*tA) (void);
typedef tA (*tB) (void);
typedef void (*tC) (tB b[]);
typedef void (*tD) (tC c);
typedef tD* (*tE) (void);
tE tArray[2];
/* Not using typedefs */
void (*_A) (void);
void (* (*_B) (void) ) (void);
void (*_C) ( void (* (*_B[]) (void) ) (void) );
void (*_D) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
void (** (*_E) (void) ) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
void (** (*_Array[2]) (void) ) ( void (*_C) ( void (* (*_B[]) (void) ) (void) ) );
/* Some concrete functions for testing */
void fA(void)
{
printf("fA\n");
}
tA fB(void)
{
printf("fB\n");
return &fA;
}
void fC(tB b[])
{
tA _a;
printf("fC\n");
_a = (*b[0])();
(*_a)();
}
void fD(tC c)
{
tB b[1];
printf("fD\n");
b[0] = &fB;
(*c)(b);
}
tD* fE(void)
{
tD *d;
printf("fE\n");
d = malloc(sizeof(tD));
d[0] = &fD;
return d;
}
int main()
{
tA _a;
tB _b;
tC _c;
tD _d;
tE _e;
tB b[1];
tD *d;
_a = &fA;
_A = &fA;
printf("_a\n");
(*_a)();
printf("_A\n");
(*_A)();
_b = &fB;
_B = &fB;
printf("_b\n");
_a = (*_b)();
(*_a)();
printf("_B\n");
_a = (*_B)();
(*_a)();
_c = &fC;
_C = &fC;
b[0] = _b;
printf("_c\n");
(*_c)(b);
printf("_C\n");
(*_C)(b);
_d = &fD;
_D = &fD;
printf("_d\n");
(*_d)(&fC);
printf("_D\n");
(*_D)(&fC);
_e = &fE;
_E = &fE;
printf("_e\n");
d = (*_e)();
(*d[0])(&fC);
free(d);
printf("_E\n");
d = (*_E)();
(*d[0])(&fC);
free(d);
printf("tArray\n");
tArray[0] = &fE;
d = (*tArray[0])();
(*d[0])(&fC);
free(d);
printf("_Array\n");
_Array[0] = &fE;
d = (*_Array[0])();
(*d[0])(&fC);
free(d);
return 0;
}+139
#define BPP_AES_SHIFT_ROWS_II(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
(a)(f)(k)(p)(e)(j)(o)(d)(i)(n)(c)(h)(m)(b)(g)(l)
Навеяно http://govnokod.ru/14511
Welcome to the macro hell: https://github.com/bormand/pp_aes
+137
#define SPLICE(a,b) SPLICE_1(a,b)
#define SPLICE_1(a,b) SPLICE_2(a,b)
#define SPLICE_2(a,b) a##b
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
_61, _62, _63, N, ...) N
/* Note 63 is removed */
#define PP_RSEQ_N() \
62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
/* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
#define PP_NARG(...) PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
#define NARG(...) func(PP_NARG(__VA_ARGS__), __VA_ARGS__)
#define INCR 20
#define FIELD_0(...)
#define FIELD_1(field, ...) \
INCR+field
#define FIELD_2(field, ...) \
INCR+field, FIELD_1(__VA_ARGS__)
#define FIELD_3(field, ...) \
INCR+field, FIELD_2(__VA_ARGS__)
#define FIELD_4(field, ...) \
INCR+field, FIELD_3(__VA_ARGS__)
#define FIELD_5(field, ...) \
INCR+field, FIELD_4(__VA_ARGS__)
#define FIELD_5(field, ...) \
INCR+field, FIELD_4(__VA_ARGS__)
#define FIELD_6(field, ...) \
INCR+field, FIELD_5(__VA_ARGS__)
#define FIELD_7(field, ...) \
INCR+field, FIELD_6(__VA_ARGS__)
#define FIELD_8(field, ...) \
INCR+field, FIELD_7(__VA_ARGS__)
#define FIELD_9(field, ...) \
INCR+field, FIELD_8(__VA_ARGS__)
#define FIELD_10(field, ...) \
INCR+field, FIELD_9(__VA_ARGS__)
#define FIELD_11(field, ...) \
INCR+field, FIELD_10(__VA_ARGS__)
//..... дальше лень ...
#define FIELDS_(N, ...) \
SPLICE(FIELD_, N)(__VA_ARGS__)
#define FIELDS(...) \
FIELDS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
a = { FIELDS('p', 'a', 's', 's', 'w', 'o', 'r', 'd') }
Примитивное компил-тайм шифрование строки через сишный препроцессор. На выходе получаем
a = { 20 +'p', 20 +'a', 20 +'s', 20 +'s', 20 +'w', 20 +'o', 20 +'r', 20 +'d' };+132
rc = system
(
"test "
"`ls -1 $WORKDIR/somedir/ | wc -l` = 1"
" -a "
"`ls -1 $WORKDIR/somedir/*/somefiles.* | wc -l` = 1"
);
ASSERTM( rc != -1, "check for number of <dirs>" );
ASSERTM( rc == 0, "number of <some> files is greater than 1" );
по мотивам http://govnokod.ru/14374
из теста. да, можно было на С написать. да, мне было просто лень.
+139
#include "intel_glamor.h"
Строка из драйвера видеокарты X11: intel_driver.c.
Гламур спасёт мир.
+136
int file_exist (char *filename)
{
char s[200];
sprintf(s, "test -e %s", filename);
if (system(s) == 0){
return 1;
}else{
return 0;
}
}
http://stackoverflow.com/questions/3828192/checking-if-a-directory-exists-in-unix-system-call
+135
Структура для хранения данных:
typedef struct rs_script_t {
int status; // on/off
int next_stage;
int next_time;
} rs_script_t;
Макросы:
#define SEQ(scr1,t) \
const int scr_zero = __COUNTER__; \
rs_script_t *scr = scr1; \
if ( (scr->status) && (t > scr->next_time) ) { \
switch(scr->next_stage) { \
#define END_SEQ } };
#define SEQ_FIRST \
case 0: \
scr->next_stage = scr_zero;
#define SEQ_DT(dt) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
#define SEQ_DT_TAGGED(dt,tag) \
scr->next_stage = __COUNTER__ + 1; \
scr->next_time += dt; \
break; \
case __COUNTER__: \
case (100000+tag): \
#define SEQ_LAST_DEFAULT \
scr->status = 0; \
break; \
\
default: \
DEBUG10f(":: ERROR, unknown stage position: %d \n", scr->next_stage); \
break;
#define SEQ_GOTO(dt,tag) \
scr->next_stage = 100000+tag; \
scr->next_time += dt; \
break;
#define SEQ_GOTO_INSTANT(tag) \
scr->next_stage = 100000+tag; \
break;
Пользоваться примерно так:
void process() { // вызывать каждый кадр
SEQ(&scrtest, rs_app.app_time)
SEQ_FIRST
printf("Ноль\n");
SEQ_DT(1000)
printf("Один\n");
SEQ_DT(1000)
printf("Два\n");
SEQ_DT_TAGGED(1000, 555)
printf("Три (метка №555) \n");
SEQ_DT(1000)
printf("Четыре\n");
SEQ_DT(1000)
printf("Пять\n");
SEQ_DT(1000)
printf("Шесть, повторяем с метки №555, если нажат Шифт\n");
if (rs_keyboard_is_key_down(RS_KEY_SHIFT_L)) {
SEQ_GOTO(1000, 555);
};
printf("Завершаем. \n");
SEQ_LAST_DEFAULT
END_SEQ;
};
Страдания по yield