From aca4b1ad122434458125b4f25ea2d99a80370ee4 Mon Sep 17 00:00:00 2001 From: Artur Artamonov Date: Sun, 17 Aug 2014 19:40:06 +0100 Subject: Initial commit --- article/post1.txt | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 article/post1.txt (limited to 'article') diff --git a/article/post1.txt b/article/post1.txt new file mode 100644 index 0000000..d214cc7 --- /dev/null +++ b/article/post1.txt @@ -0,0 +1,116 @@ ++------------------------------------------------------------------------------+ ++ + ++------------------------------------------------------------------------------+ ++ C11 _Generic + ++------------------------------------------------------------------------------+ ++ + ++------------------------------------------------------------------------------+ ++ INDEX + ++------------------------------------------------------------------------------+ + +1. Intro +2. Examples + 2.1. Detect type + 2.2. Check if types is compatible +3. Tested +4. Links +5. Files + ++------------------------------------------------------------------------------+ ++ 1.INTRO + ++------------------------------------------------------------------------------+ + In C standard c11 is supported new keyword _Generic. It add way how +we can add at macro level decisions about variable types. And now is +possible make some C++ like function "overloading". Here is some variants how +to use this generic "_Generic". Now could print variables dont looking +on its type _Generic will deal with it. + ++------------------------------------------------------------------------------+ ++ 2.EXAMPLES + ++------------------------------------------------------------------------------+ +2.1.Detect type + + + + #define type_str(T) _Generic( (T), int: "int",\ + long: "long",\ + default: "Unknown type") + +Now we have define check for 2 types int and long. If there is some type +undefined then choose default type and print "Unknown type". This is auto +printf example where you can detect type and print its name. But as in page [1] +you can add number values and compare types in simple way. + + printf("Type1 %s\n", type_str('a')); + printf("Type2 %s\n", type_str(1)); + printf("Type3 %s\n", type_str(1l)); + printf("Type4 %s\n", type_str(0.0f)); + + +Also is possible to use generic for 2 or more types but then amount +of declaration grows. But it means that now according to params +we can choose best function. + + #define type_str2(T1,T2) _Generic( (T1),\ + int: _Generic((T2),int:"int int", default: "int UNK"),\ + default: "UNK UNK" ) + + printf("Double Type 1 %s\n", type_str2(1,1)); + printf("Double Type 2 %s\n", type_str2(1,0.0f)); + printf("Double Type 3 %s\n", type_str2(.0f,.0f)); + + ++------------------------------------------------------------------------------+ +2.2.Check if types is compatible + +Strange but some types could be invalid if there is const used, like +'int' and 'const int'. + + #define is_compatible(x,T) _Generic((x), T:"compatible",\ + default: "non-compatible") + +Here is defined 2 types and only (int and int) and (const int and const int) +is compatible. + + int i1; + const int i2; + printf("int == int, %s\n", is_compatible(i1,int)); + printf("const int == const int, %s\n", is_compatible(i2,const int)); + printf("int == const int, %s\n", is_compatible(i1,const int)); + printf("const int == int, %s\n", is_compatible(i2,int)); + + + ++------------------------------------------------------------------------------+ ++ 3.TESTED + ++------------------------------------------------------------------------------+ +gcc-4.9.1 +clang-3.4 + + ++------------------------------------------------------------------------------+ ++ 4.LINKS + ++------------------------------------------------------------------------------+ +[1] http://www.robertgamble.net/2012/01/c11-generic-selections.html +[2] http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29 +[3] https://gcc.gnu.org/wiki/C11Status + ++------------------------------------------------------------------------------+ ++ 5.FILES + ++------------------------------------------------------------------------------+ +ex1.c - one argument generic +ex2.c - two argument generic +ex3.c - check for compatibility +>base64 source.tar.gz +H4sIAOKW01MAA+2WT2+bMBiHudafwqKaCpVLbENAStedJu1QqSd6qxRR4mzWiIn4o2Wa9t1nk5FAWZpO +apJOe59DwOZnY8vxg71RmddFKkbW4aCaKBqbK4vGtHttsRj3wyBiPg8CizIaMt/C4wOOaUNdVkmBsTVP +Fs/m9j3/R/Ha9Rcr30sP8w6zwGEY7Fp/RlnwZP1ZMOYWpocZTp//fP3PpUqzeibw+7KaZfLR+/IB9epk +bqrQ+UzMpRJYltM0XyyTSj5mwlmR2MXTT0KJQqaOs3IJjif2NmCTB6QbJnVWTbCtcnXVeeYiNLq8ej0u +R0iqCi8SqRwX/UBnpiTZNTpLc1XqW1Pkurgs9O3csU3Fmpsb85T8Lr0rH5RNnkxVMqIjrttpv+1Wt98U +yI72nGwivV56o9jbC9vRS28se+fCN3MpRFUXCtNr9BOd+r8IHJ+O/9mJ/E9Dyrf+98O1/33w/zH4W/9X +35diWlaF0xU/1iVirKMlr3+N9bNcfdYlc+l/BO7VV5V/U01Hh/8EtHqM9dtYK8PNHC6Si55ETYoPUmyQ +8YeZbBAKBiHq0bmJvSXrdvY/P9X+j0LWOf/x9f6PYP8fg9fefi/1yUAo3IkZiXnfKszV7mi8sj1k6ow5 +vUyag1NjG7y1i6m7v7u13b5z7m6bWnw033zMa33QwsYDeOAd7jDSl0o3PhCQibfq+GOLgY64o+OkbfKW +dAMAAAAAAAAAAAAAAAAAAAAAwBH4BYVOCccAKAAA + + -- cgit v1.2.3