为什么这段代码用clang而不是gcc编译?我正在学习C语言中的不透明结构
我正在学习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为什么这段代码用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结构计数器; /*原型*
#如果取消我的计数器#
#定义我的计数器
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一起工作吗?