问题标签 [implicit-declaration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1328 浏览

c - cfmakeraw 隐式声明错误

我正在编写多线程应用程序(作为作业)。其中一个线程专用于读取键盘按键,因此在原始模式下使用终端。但我不断收到错误

即使我有unistd.htermios.h包括在内。

我正在使用带有 -std=c99 标志的 gcc 5.4.0 在 Linux (xubuntu 16.04) 上编程。代码看起来像:

0 投票
3 回答
10076 浏览

c - 函数的隐式声明,与头文件 include 和 ifndef 无关

我有众所周知的错误:

implicit declaration of function 'STLINKReadSytemCalls' [-Wimplicit-function-declaration]
implicit declaration of function 'printf' [-Wimplicit-function-declaration]
incompatible implicit declaration of built-in function 'printf'

并且 Eclipse(更准确地说是 Atollic TrueStudio)添加:

include '<stdio.h>' or provide a declaration of 'printf'

阅读数十亿的帖子询问如何在 SO 上解决这个问题,似乎三个问题可能会导致这些错误:

  • 函数在 main 之后定义;
  • 包含使用函数所需的标头
  • #ifndef,#define并且#endif没有正确包装头文件

我发现了一个帖子,其中有人似乎有这个错误,并在修复它后说 Eclipse 是问题所在。虽然找不到主题,但他的解决方案对我不起作用。这就像单击功能,source -> add includes

主程序

文件处理.c

文件处理.h

最令人困惑的部分是代码确实有效。我有以下输出:

一切似乎都很好,但编译器一直在大喊大叫。如果需要,我将添加函数的主体,但我没有看到任何线索表明函数的主体可能导致包含错误。我一定是遗漏了一些如此明显的东西,以至于当我看到它时,我会像从未有过的那样自我捂脸;但我已经花了几个小时,我希望这很明显变得越来越薄。

哦,昨天使用相同的包含路径和相同的目录构建它工作得非常好。我真的不知道从那以后发生了什么变化。

0 投票
4 回答
875 浏览

c - C中同一函数的多个隐式声明

这是我的代码:

现在因为 C 可以隐式声明一个函数,这个程序将正确编译(就像它使用 gcc 一样)。
但我的问题是,第一个printf声明不是返回一个带有 1 个类型参数的 intchar *吗?
这使得第二printf个错误。
然而程序编译没有错误,只是警告(gcc)。为什么 ?

0 投票
1 回答
131 浏览

c++ - Is there such thing as implicit declaration in c++?

I was burnt just now. I hadn't enabled warnings while compiling my c code. I was using atof without including stdlib.h. So the atof was using implicit declaration which had default return type of int. So the code wasn't working. I was wondering if the concept of implicit declarations also applies to c++?

0 投票
1 回答
155 浏览

c++ - Unexpectedly missing implicitly declared copy/move constructors

Consider the following:

gcc 7.3.0 fails to compile it (deep within std::is_invocable_r):

as does clang 5.0.1:

From this I deduce that C is missing move and copy constructors. Indeed, if we uncomment its move constructor (1), this code compiles.

I believe the requirements for them to be implicitly declared are satisfied. Why aren't they?

0 投票
2 回答
1008 浏览

c - How to use printf() without any libraries in C?

I am programming a Teensy micro-controller as a part of a C course and am trying to work out the value of one of my integer variables. I have an integer variable called Contrast, which is initialised to the value of a constant defined as a hexadecimal number at the beginning of the .c file:

I am trying to investigate how this Contrast value is stored and displayed, if it shows up as 63 or 0x3F, and if they are interchangeable. I tried to use:

to print out the Contrast value to the terminal and I got the error implicit declaration of function 'printf'. I thought printf() was part of the built-in C library, so I am confused why this is not working.

Can anyone please tell me how I print the value of this variable to the screen?

0 投票
1 回答
87 浏览

c - 谁能详细告诉我,为什么我正在观看该程序的警告?

当我运行此代码时,它显示以下警告,

函数“tolower”的隐式声明 [-Wimplicit-function-declaration]

有时输出是意外的,例如如果我输入输入:

输入::xnhcigytnqcmy

输出::.xnhcgytnqcmy

预期输出:

.xnhcgtnqcm

那么谁能告诉我我在哪里犯了错误?

0 投票
0 回答
334 浏览

c++ - C++隐式定义特殊函数

在当前版本的 C++ 草案(2019 年 9 月)中,第[class.default.ctor]/4段指出:

一个默认且未定义为已删除的默认构造函数在使用 odr ([basic.def.odr]) 创建其类类型 ([intro.object]) 的对象时隐式定义常量求值([expr.const]),或者在第一次声明后显式默认。[...]。在隐式定义类的默认默认构造函数之前,应隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数。[注意:隐式声明的默认构造函数具有异常规范([except.spec])。显式默认定义可能具有隐式异常规范,请参阅 [dcl.fct.def]。——尾注]

[class.dtor]/11为默认析构函数指定了类似的限制。

突出显示的句子是什么意思?是对程序还是对实现(编译器)的限制?

引用段落的第一句说明了默认的默认构造函数何时被隐式定义(例如,当它被使用时)。如果突出显示的句子是对程序的限制,那么下面的例子应该是错误的,因为在(1)处,默认的默认构造函数B是 odr-used,因此它是隐式定义的。但是,此时,默认的默认构造函数A还没有被隐式定义,因此突出显示的句子中的限制不受尊重。这是因为我相信只有在定义A了默认的默认构造函数之后,才会使用默认的默认构造B函数。这个假设是错误的吗?

谢谢你。

0 投票
1 回答
232 浏览

c++ - 该标准是否允许在没有创建其类的实例时不隐式定义隐式虚拟析构函数?

在思考这个问题时,我偶然发现了一些我不明白的东西。

标准说...

[class.dtor]/4

如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值。隐式声明的析构函数是其类的内联公共成员。

[class.dtor]/10

[...] 如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。

[class.dtor]/7

默认且未定义为已删除的析构函数在使用 odr 或在其第一次声明后显式默认时隐式定义。

[basic.def.odr]/3

[...]如果它不是纯的,则虚拟成员函数是 odr-used 的。[...]

所以现在我想知道这段代码是否应该编译:

https://godbolt.org/z/B0wvzd

我认为~Foo()必须隐式定义,因为它是虚拟的,但它不会编译,因为Bar在这个 TU 中不完整。然而,代码可以在所有主要编译器中编译。

我错过了什么?

0 投票
2 回答
78 浏览

compiler-construction - 转译/代码生成 - 变量声明问题

我最近一直在研究 ANTLR 和 Java,我构建了一个简单的语法来解析这段代码并生成一个 AST。我还编写了一个内置解释器来执行这段代码,它似乎运行良好:

关于我的玩具语言的一些注释:

  • 我的语言只有一种可变的“双”
  • 所有变量都在赋值时隐式声明。
  • 所有变量都具有全局范围。即,即使在分配它的块之外,我也可以在分配变量之后使用它。

然后我将代码生成函数写入 AST 以将其从我的 AST 类输出到 C,我得到了这个结果(美化):

在代码生成期间,我首先检查变量名称是否在 HashMap 中可用。对于赋值语句/输入语句,我在赋值之前添加了变量声明,如您所见。对于赋值以外的变量的使用,我会在使用前抛出一个非初始化变量的异常。

一切都很好。上面的代码适用于这个例子,因为在我的源程序中,我没有在声明它的范围之外使用任何变量。

但是有一个问题。由于我正在初始化块内的某些变量(就像while它们不能在范围外使用),我需要一种方法来收集源程序中使用的所有变量作为 C 中的全局变量(或至少在 main() 函数的顶部)。如果在块外的程序中使用该变量,则在 C 中使用之前声明变量将导致源语言中的有效程序无法在 C 中编译。

我想我可以通过首先解析所有变量并在 C 程序开始时声明它们然后生成代码来解决它。

但是如果我在生成代码之前更新符号表(HashMap),我将无法知道变量是否在使用前被实际分配。

重新设计它以确保:

  • 代码生成器应在使用前检查分配。即,如果它在赋值之前发现了一个用法,它应该抛出一个异常/编译错误。
  • 同时,我的代码中的所有变量都应该在 C 生成的源代码中作为全局变量可用。因此,如果之前在内部块中分配变量,则即使在块外使用变量也是可能的,因为在我的源语言中它是可以接受的。

这是我第一次尝试这样的事情。请为我提供任何可能的解决方案的指针。