是";“小”;c中的关键字?

是";“小”;c中的关键字?,c,header-files,identifier,C,Header Files,Identifier,这是第一个代码 #include <stdio.h> #include <conio.h> int main() { int small;//showing error-(two or more data type in declaration specifiers } 从 即使在包含否之后仍有效。标准C中没有类似small的关键字。这可能是中的宏 C11:6.4.1关键词: 关键词:其中一个 auto break case char const contin

这是第一个代码

#include <stdio.h>
#include <conio.h>
int main()
{
    int small;//showing error-(two or more data type in declaration specifiers
}


即使在包含

否之后仍有效。标准C中没有类似
small
的关键字。这可能是
中的宏

C11:6.4.1关键词: 关键词:其中一个

auto 
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
_Alignas
_Alignof
_Atomic
_Bool
_Complex
_Generic
_Imaginary
_Noreturn
_Static_assert
_Thread_local

没有这样的关键字,但请检查它是否在某个地方
typedef
ed

这个错误似乎是MinGW的错。同样的错误出现在
large

我发现了它。。。 它是在
windows.h
中包含的某些头文件中定义的宏

由于我在
conio.h
中包含了
windows.h
,因此在我的程序中,当我包含
conio.h
时,它会自动包含在我的程序中

我通过按住ctrl键并单击
small

找到了它。通过添加
#include
,您可以导入许多其他头文件。它定义了一个预处理器宏“小”。另一份报告也讨论了这一问题


一种解决方法是在
#include
之后添加
#undef small
,我保证
small
在C中不是关键字。如果是,则是否有
#include
指令不会有任何区别

问题在于
愚蠢地将
small
定义为宏。(其他答案和评论表明它可能是
typedef
,但这并不能解释您看到的问题。)

我能够在我的系统上重现这个问题(Cygwin,Windows 7,使用
mingw32 gcc
编译,作为Cygwin包的一部分安装)。与Cygwin分开安装的MinGW可能也会发生同样的情况

首先,
是实现提供的(非标准)头。你几乎肯定不应该试图修改它。您绝对不应该将函数定义添加到头文件中(函数定义属于
.c
文件,而不属于
.h
文件)。如果您想编写自己的
gotoxy
函数,请在自己的头中声明它,并在自己的
.c
文件中定义它;不要在实现过程中乱来。(B)

但是当您将
gotoxy
函数添加到
时,您还添加了

#include <windows.h>
进一步挖掘,发现
包括
,其中包含以下内容:

#define small char
因此,在任何具有
#include
的C源代码中,每次出现标识符
small
,都将被关键字
char
替换,在您的情况下,这将导致语法错误

查找类似内容的简便方法:
gcc
有一个
-E
选项,使其显示编译器预处理器阶段的输出。使用上述程序,我尝试了以下方法:

$ mingw32-gcc -E c.c | tail



#pragma pack(pop)
# 115 "c:\\gnustep\\bin\\../lib/gcc/mingw32/4.6.1/../../../../include/windows.h" 2 3
# 2 "c.c" 2
int main()
{
    int char;
}
$ 
这显示了预处理器是如何损坏
int short;
声明的

要明确的是,这完全是
的维护人员的错误,
small
是一个完全有效的C标识符,系统头绝对不应该将其定义为宏。
typedef char small;
会起到同样的作用,而不会导致此问题。其他人则使用
定义宏
min
max
。这些宏可以使用:

#define NOMINMAX
#include <windows.h>
在声明之前。您不需要做这两件事,但由于系统头编写得很糟糕,所以有时需要这样的解决方法

或者只是避免包含
(这并不总是可能的)

(您可以修改
rpcndr.h
文件的副本,但我建议不要这样做;这可能会导致其他问题,并且您的代码仍然无法在
rpcndr.h
未被黑客攻击的系统上编译。)


更新:这可能已被更正。在Windows 10上的Cygwin下使用
x86\u 64-w64-mingw32-gcc
时,我没有发现错误。也许使用mingw的其他人可以进一步调查。

只需在“代码”或“VS属性”对话框中定义
WIN32\u LEAN\u和
宏,问题就会消失:

#define WIN32_LEAN_AND_MEAN

不,但它可能是您的conio.h中的typedef或#define。为什么不看一看?这让我怀疑conio.h或它包含的东西将“小”定义为宏。这不好。没有“小”源代码中的单词。想知道为什么会出现此错误…也许这与此相关:一个
typedef
不会导致此问题;只有一个宏会导致此问题。它也可以在标题
#中定义,包括
conio.h
中的
d,但不在
stdio.h
@haccks中:对此查询有任何解释吗?我不理解last添加了您的部分答案。我只是想问是否有任何关于上述问题的解释。我的知识有限,不能说对上述问题是否有任何解释。我在这里读到:“Int“large”被修改为“large”,纯粹是出于美学原因”抱歉:在删除
void gotoxy()之后
conio.h
int small;
起作用fine@learner:如果
#include
,并且
conio.h
是由您的实现提供的,您仍然会遇到同样的问题;您不应该修改它。它是否为
typedef
ed并不重要。如果是,则声明
int small;
在inne中r范围将是完全合法的,并将隐藏
typedef
。它更可能是一个宏。很好的小回答。不能完全否认
的维护者的错误。为了避免包含
windows.h
,可以为所需的函数创建一个包装器,只在该模块中包含
windows.h
c.c: In function 'main':
c.c:4:9: error: two or more data types in declaration specifiers
c.c:4:5: warning: useless type name in empty declaration [enabled by default]
#define small char
$ mingw32-gcc -E c.c | tail



#pragma pack(pop)
# 115 "c:\\gnustep\\bin\\../lib/gcc/mingw32/4.6.1/../../../../include/windows.h" 2 3
# 2 "c.c" 2
int main()
{
    int char;
}
$ 
#define NOMINMAX
#include <windows.h>
#undef small
#define WIN32_LEAN_AND_MEAN