// filename:c2011-6-9-2-ex.c // original examples and/or notes: // (c) ISO/IEC JTC1 SC22 WG14 N1570, April 12, 2011 // http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf // C2011 6.9.2 External object definitions // compile and output mechanism: // (c) Ogawa Kiyoshi, kaizen@gifu-u.ac.jp, December.xx, 2013 // compile errors and/or wornings: // 1 (c) Apple LLVM version 4.2 (clang-425.0.27) (based on LLVM 3.2svn) // Target: x86_64-apple-darwin11.4.2 //Thread model: posix // (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign. // 2 gcc-4.9 (GCC) 4.9.0 20131229 (experimental) // Copyright (C) 2013 Free Software Foundation, Inc. #include // Example 1 int i1 = 1; // definition, external linkage static int i2 = 2; // definition, internal linkage extern int i3 = 3; // definition, external linkage int i4; // tentative definition, external linkage static int i5; // tentative definition, internal linkage int i1; // valid tentative definition, refers to previous int i2; // 6.2.2 renders undefined, linkage disagreement //** //c2011-6-9-2-ex.c:19:5: error: non-static declaration of 'i2' follows static declaration //int i2; // 6.2.2 renders undefined, linkage disagreement // ^ //c2011-6-9-2-ex.c:14:12: note: previous definition is here //static int i2 = 2; // definition, internal linkage // ^ int i3; // valid tentative definition, refers to previous int i4; // valid tentative definition, refers to previous int i5; // 6.2.2 renders undefined, linkage disagreement //** //c2011-6-9-2-ex.c:22:5: error: non-static declaration of 'i5' follows static declaration //int i5; // 6.2.2 renders undefined, linkage disagreement // ^ //c2011-6-9-2-ex.c:17:12: note: previous definition is here //static int i5; // tentative definition, internal linkage // ^ extern int i1; // refers to previous, whose linkage is external extern int i2; // refers to previous, whose linkage is internal extern int i3; // refers to previous, whose linkage is external extern int i4; // refers to previous, whose linkage is external extern int i5; // refers to previous, whose linkage is interna //Example 2 int i[]; int main(void) { return printf("6.9.2 External object definitions %d %d %d %d %d %d\n",i1,i2,i3,i4,i5,i[0]); } // 1. LLVM(3.2) warning //c2011-6-9-2-ex.c:15:12: warning: 'extern' variable has an initializer [-Wextern-initializer] //extern int i3 = 3; // definition, external linkage // ^ //c2011-6-9-2-ex.c:44:5: warning: tentative array definition assumed to have one element //int i[]; // ^ //2 warnings generated. // 2. GCC4.9 warning //c2011-6-9-2-ex.c:15:12: warning: 'i3' initialized and declared 'extern' [enabled by default] // extern int i3 = 3; // definition, external linkage // ^ //c2011-6-9-2-ex.c:44:5: warning: array 'i' assumed to have one element [enabled by default] // int i[]; // ^ // output may be // 6.9.2 External object definitions 1 2 3 0 0 0