为什么这段代码用clang而不是gcc编译?我正在学习C语言中的不透明结构

为什么这段代码用clang而不是gcc编译?我正在学习C语言中的不透明结构,c,gcc,clang,C,Gcc,Clang,我正在学习C中的不透明结构。我有一个头文件,其中我使用了不透明的结构和API。然后,我将实现移动到一个.c文件,为应用程序创建一个测试文件。当我试着用clang[Apple clang version 11.0.3(clang-1103.0.32.62)]这个应用程序编译并运行它时,它确实如预期的那样工作,当我使用gcc[gcc-10(自制gcc 10.2.0)10.2.0]时失败 我在下面列出了源代码 计数器.h #如果取消我的计数器# #定义我的计数器 typedef结构计数器; /*原型*

我正在学习C中的不透明结构。我有一个头文件,其中我使用了不透明的结构和API。然后,我将实现移动到一个.c文件,为应用程序创建一个测试文件。当我试着用clang[Apple clang version 11.0.3(clang-1103.0.32.62)]这个应用程序编译并运行它时,它确实如预期的那样工作,当我使用gcc[gcc-10(自制gcc 10.2.0)10.2.0]时失败

我在下面列出了源代码

计数器.h

#如果取消我的计数器#
#定义我的计数器
typedef结构计数器;
/*原型*/
计数器*计数器创建(无效);
无效反销毁(计数器*c);
int计数器增量(计数器*c);
#恩迪夫
计数器.c

#包括
#包括
#包括
#包括“counter.h”
结构计数器{
int值;
};
/*创建一个计数器*/
计数器*计数器创建(无效)
{
计数器*c;
c=(计数器*)malloc(计数器大小);
断言(c);
c->value=0;
返回c;
}
/*释放计数器拥有的内存插槽*/
无效反销毁(计数器*c)
{
免费(c);
}
/*递增计数器中的当前值并返回它*/
int计数器增量(计数器*c)
{
返回++(c->value);
}
tstCounter.c

#包括
#包括“counter.h”
内部主(空)
{
计数器*c;
c=计数器创建();
int值;
而((值=反增量(c))<10){
printf(“%d”,值);
}
putchar('\n');
反破坏(c);
返回0;
}
下面是如何使用clang编译代码:

clang-Wall-Wextra-c counter.c
叮当声-Wall-Wextra-c tstCounter.c
叮当声计数器.o tstCounter.o-o counterEXE
#
#然后执行过程如下所示:
/counterEXE
#产生以下输出:
1 2 3 4 5 6 7 8 9 
但同样的过程在gcc中失败了

gcc -Wall -Wextra -c counter.c
产生以下输出:

In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/wait.h:110,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:66,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h: In function 'getiopolicy_np':
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:447:34: error: expected declaration specifiers before '__OSX_AVAILABLE_STARTING'
  447 | int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:453:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
  453 | int     setiopolicy_np(int, int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/libkern/_OSByteOrder.h:66,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_endian.h:130,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/i386/endian.h:99,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/machine/endian.h:35,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/wait.h:186,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:66,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/libkern/i386/_OSByteOrder.h:49:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
   49 | {
      | ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/libkern/i386/_OSByteOrder.h:58:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
   58 | {
      | ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/libkern/i386/_OSByteOrder.h:96:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
   96 | {
      | ^
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:77,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_ct_rune_t.h:32:28: error: storage class specified for parameter 'ct_rune_t'
   32 | typedef __darwin_ct_rune_t ct_rune_t;
      |                            ^~~~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:78,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_rune_t.h:31:25: error: storage class specified for parameter 'rune_t'
   31 | typedef __darwin_rune_t rune_t;
      |                         ^~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:81,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_wchar_t.h:34:26: error: storage class specified for parameter 'wchar_t'
   34 | typedef __darwin_wchar_t wchar_t;
      |                          ^~~~~~~
In file included from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:86:3: error: storage class specified for parameter 'div_t'
   86 | } div_t;
      |   ^~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:91:3: error: storage class specified for parameter 'ldiv_t'
   91 | } ldiv_t;
      |   ^~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:97:3: error: storage class specified for parameter 'lldiv_t'
   97 | } lldiv_t;
      |   ^~~~~~~
In file included from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:118:12: error: sto
rage class specified for parameter '__mb_cur_max'
  118 | extern int __mb_cur_max;
      |            ^~~~~~~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:128,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/malloc/_malloc.h:52:74: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
   52 | int   posix_memalign(void **__memptr, size_t __alignment, size_t __size) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0);
      |
~~~~~~~~~
In file included from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:144:1: error: expected declaration specifiers before 'div_t'
  144 | div_t  div(int, int) __pure2;
      | ^~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:149:1: error: expected declaration specifiers before 'ldiv_t'
  149 | ldiv_t  ldiv(long, long) __pure2;
      | ^~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:153:1: error: expe
cted declaration specifiers before 'lldiv_t'
  153 | lldiv_t  lldiv(long long, long long);
      | ^~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:157:18: error: expected declaration specifiers or '...' before 'wchar_t'
  157 | size_t  mbstowcs(wchar_t * __restrict , const char * __restrict, size_t);
      |                  ^~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:158:13: error: expected declaration specifiers or '...' before 'wchar_t'
  158 | int  mbtowc(wchar_t * __restrict, const char * __restrict, size_t);
      |             ^~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:194:51: error: expected ';', ',' or ')' before '*' token
  194 | size_t  wcstombs(char * __restrict, const wchar_t * __restrict, size_t);
      |                                                   ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:195:21: error: expected declaration specifiers or '...' before 'wchar_t'
  195 | int  wctomb(char *, wchar_t);
      |                     ^~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:260,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_dev_t.h:31:31: error: storage class specified for parameter 'dev_t'
   31 | typedef __darwin_dev_t        dev_t;    /* device number */
      |                               ^~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:261,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types/_mode_t.h:31:33: error: storage class specified for parameter 'mode_t'
   31 | typedef __darwin_mode_t         mode_t;
      |                                 ^~~~~~
In file included from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:270:53: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
  270 | void  arc4random_buf(void * __buf, size_t __nbytes) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
      |                                                     ^~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:273:46: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
  273 |   arc4random_uniform(uint32_t __upper_bound) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3);
      |
In file included from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:292:45: error: expected ',' or ';' before '__OSX_AVAILABLE_BUT_DEPRECATED_MSG'
  292 | int  daemon(int, int) __DARWIN_1050(daemon) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_0, __MAC_10_5, __IPHONE_2_0, __IPHONE_2_0, "Use posix_spawn APIs instead.") __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
      |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:294:31: error: expected ')' before 'char'
  294 | char *devname_r(dev_t, mode_t, char *buf, int len);
      |                               ^~~~~
      |                               )
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:325:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
  325 |      __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:333:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__OSX_AVAILABLE_STARTING'
  333 |      __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
      |      ^~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:356:14: error: storage class specified for parameter 'suboptarg'
356 | extern char *suboptarg;  /* getsubopt(3) external variable */
      |              ^~~~~~~~~
In file included from counter.c:8:
counter.h:6:24: error: storage class specified for parameter 'Counter'
    6 | typedef struct counter Counter;
      |                        ^~~~~~~
counter.h:9:1: error: expected declaration specifiers before 'Counter'
    9 | Counter *counterCreate(void);
      | ^~~~~~~
counter.h:10:21: error: expected declaration specifiers or '...' before 'Counter'
   10 | void counterDestroy(Counter *);
      |                     ^~~~~~~
counter.h:11:22: error: expected declaration specifiers or '...' before 'Counter'
   11 | int counterIncrement(Counter *);
      |                      ^~~~~~~
counter.c:11:1: warning: empty declaration
   11 | struct counter {
      | ^~~~~~
counter.c:18:1: error: expected declaration specifiers before 'Counter'
   18 | Counter *counterCreate(void)
      | ^~~~~~~
counter.c:30:21: error: expected declaration specifiers or '...' before 'Counter'
   30 | void counterDestroy(Counter *c)
      |                     ^~~~~~~
counter.c:36:22: error: expected declaration specifiers or '...' before 'Counter'
   36 | int counterIncrement(Counter *c)
      |                      ^~~~~~~
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/wait.h:110,
                 from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/stdlib.h:66,
                 from counter.c:5:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:447:9: error: old-style parameter declarations in prototyped function definition
  447 | int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
      |         ^~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:447:24: error: parameter name omitted
  447 | int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
      |                        ^~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:447:29: error: parameter name omitted
  447 | int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
      |                             ^~~
counter.c:39: error: expected '{' at end of input
      |                        ^~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/resource.h:447:29: error: parameter name omitted
  447 | int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
      |                             ^~~
counter.c:39: error: expected '{' at end of input
   39 | }
      |
counter.c:39: warning: control reaches end of non-void function [-Wreturn-type]
   39 | }
      |



如果有人能帮助我理解为什么gcc出现此错误,我将不胜感激。提前感谢您。

您的gcc安装似乎有问题。你能编译一个只包含
#include
的文件吗?另外,这是counter.c的确切内容吗?编译器输出表明在显示之前还有4行。错误来自
\include
,它位于
\include“counter.h”
之前。不可能是计数器代码导致了这种情况。gcc最近是否与OSX一起工作?这似乎是gcc安装的问题。你能编译一个只包含
#include
的文件吗?另外,这是counter.c的确切内容吗?编译器输出表明在显示之前还有4行。错误来自
\include
,它位于
\include“counter.h”
之前。不可能是计数器代码导致了这种情况。现在gcc与OSX一起工作吗?