- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是第一个代码
#include <stdio.h>
#include <conio.h>
int main()
{
int small;//showing error-(two or more data type in declaration specifiers
}
这是第二个代码
#include <stdio.h>
int main()
{
int small;//normal declaration without any error
}
每当我包含头文件时 <conio.h>
然后声明标识符“small”会出错,为什么?我正在使用 mingw gcc
编译器和 codeblocks
想法
我还在 <conio.h>
中添加了以下代码
#include <windows.h>
void gotoxy(short int col,short int row)
{
HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
COORD position={col,row};
SetConsoleCursorPosition(hStdout,position);
}
从 <conio.h>
中删除上述代码后
int small;
即使在包含 <conio.h>
之后仍然有效.
最佳答案
我保证small
不是 C 中的关键字。如果是,#include
是否存在指令不会有任何区别。
问题是 <windows.h>
愚蠢地定义small
作为宏。 (其他答案和评论表明它可能是 typedef
,但这并不能解释您所看到的问题。)
我能够在我的系统上重现该问题(Cygwin、Windows 7,使用 mingw32-gcc
编译,作为 Cygwin 软件包的一部分安装)。如果 MinGW 与 Cygwin 分开安装,大概也会发生同样的事情。
首先,<conio.h>
是实现提供的(非标准) header 。您几乎肯定不应该尝试修改它。您绝对不应该将函数定义添加到头文件(函数定义属于.c
文件,而不是.h
文件)。如果你想自己写gotoxy
函数,在你自己的header中声明,在你自己的.c
中定义文件;不要搞乱实现。 (B
但是当你添加你的 gotoxy
功能<conio.h>
, 你还添加了
#include <windows.h>
这是一个说明问题的小程序:
#include <windows.h>
int main()
{
int small;
}
当我用 mingw32-gcc
编译它时,我得到:
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]
进一步挖掘,结果是 <windows.h>
包括 <rpcndr.h>
,其中包含以下内容:
#define small char
因此每次出现标识符 small
在任何具有 #include <windows.h>
的 C 源代码中将被关键字 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;
声明被预处理器破坏了。
需要说明的是,这完全是 <windows.h>
维护者的错和 <rpcndr.h>
. small
是完全有效的 C 标识符,系统头文件绝对不应将其定义为宏。 typedef char small;
本来可以达到同样的目的,不会引起这个问题。其他人有similar problems与 <windows.h>
定义宏 min
和 max
.这可以解决:
#define NOMINMAX
#include <windows.h>
但据我所知,small
没有这样的解决方法.
顺便说一句,rpcndr.h
还定义了 hyper
.
最简单的解决方案是将变量命名为 small
以外的名称-- 并希望您不会与 <windows.h>
中定义的其他宏发生冲突.或者你可以添加
#undef small
声明之前。您不应该需要做这些事情中的任何一个,但由于系统头文件编写不当,有时需要这样的解决方法。
或者只是避免包含 <windows.h>
(这并不总是可能的)。
(您可以修改您的 rpcndr.h
文件副本,但我建议您不要这样做;这可能会导致其他问题,并且您的代码仍然无法在 rpcndr.h
未被破解的系统上编译.)
更新:这可能已经更正。我没有看到使用 x86_64-w64-mingw32-gcc
的错误在 Windows 10 上的 Cygwin 下。也许其他使用 mingw 的人可以进一步调查。
关于c - "small"是c 中的关键字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165891/
如果我创建一个对象时没有使用 new 关键字,例如“Object s(someval)”,但该对象的构造函数使用了 new,当该对象超出范围时,是否会调用析构函数为其分配新的空间?我感觉好像是,但我不
在 SQL 语法中,我发现奇怪的规则表明 select * from ONLY (t1)是有效的 SQL。 我的问题是:什么是 ONLY在这种情况下是什么意思? 它在规范的“7.6 table ref
为什么使用 $(this) 而不是重新选择类很重要? 我在代码中使用了大量的动画和 CSS 编辑,并且我知道可以使用 $(this) 来简化它。 最佳答案 当您通过 jQuery 执行 DOM 查询(
我正在尝试使用 IN 关键字编写查询。 表A 属性标识、属性名称 表B key 、属性标识、属性值 根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。
这个问题在这里已经有了答案: Why would you use "AS" when aliasing a SQL table? (8 个答案) 关闭 9 年前。 我不擅长写查询,但是从我开始使用
我读过,在 Java 中,您不必将 this 关键字显式绑定(bind)到对象,它由解释器完成。它与 Javascript 相反,在 Javascript 中你总是必须知道 this 的值。但是 Ja
Swift 中“with”关键字的用途是什么?到目前为止,我发现如果您需要覆盖现有的全局函数,例如 toDebugString,可以使用该关键字。 // without "with" you
这个问题在这里已经有了答案: What does the keyword "where" in a class declaration do? (7 个答案) 关闭 9 年前。 在下面的一段代码中(
免责声明:swift 菜鸟 您好,我刚刚开始学习 Swift,正在学习 Swift 编程语言(Apple 在 WWDC 期间发布的书籍),并且想知道“where”关键字是什么。它用于 let vege
深入研究文档后,我找不到以下问题的答案: 是否有任何理由反对使用 this 来引用当前对象,如下例所示? type MyStruct struct { someField string } fun
前言 最近在做THINKPHP开发项目中,用到了 parent:: 关键字,实际上 parent::关键字 是PHP中常要用到的一个功能,这不仅仅是在 THINKPHP 项目开发中,即使是一个小型
我们都知道且经常用到 unsigned 关键字,但有没有想过,与此对应的 signed 关键字有啥用? 复制代码 代码如下: int i = 0; signed
this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。 怎么理解这段话呢? thinking i
一 什么是 synchronized synchronized 关键字提供了一种锁机制,能够确保共享变量互斥访问,从而防止数据不一致问题的出现。 synchronized 关键字包括 monitor
最近看了几篇 synchronized 关键字的相关文章,收获很大,想着总结一下该关键字的相关内容。 1、synchronized 的作用 原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并
在本教程中,您将借助示例了解 JavaScript 对象方法和 this 关键字。 在 JavaScript 中,对象也可以包含函数。例如, // object containing meth
有人可以解释一下 PHP“with”的作用吗? 示例开始: 假设我有一个类: \App\fa_batch 这句话有什么区别: $w = (with (new \App\fa_batch))
这个问题在这里已经有了答案: What is the difference between using the colon and as syntax for declaring type? (2
如果我在 WHERE 子句中使用以下任一项,是否会有很大不同: WHERE [Process Code] = 1 AND ([Material ID] = 'PLT' OR [Material ID]
This question is unlikely to help any future visitors; it is only relevant to a small geographic are
我是一名优秀的程序员,十分优秀!