相关疑难解决方法(0)

为什么在没有返回值的情况下流出非void函数的末尾不会产生编译器错误?

自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?

我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?

评论中要求的示例:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

...编译.

c c++ gcc g++

157
推荐指数
5
解决办法
4万
查看次数

为什么"noreturn"函数会返回?

我读了关于属性的这个问题noreturn,它用于不返回调用者的函数.

然后我用C做了一个程序.

#include <stdio.h>
#include <stdnoreturn.h>

noreturn void func()
{
        printf("noreturn func\n");
}

int main()
{
        func();
}
Run Code Online (Sandbox Code Playgroud)

并使用以下代码生成代码的汇编:

.LC0:
        .string "func"
func:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $.LC0, %edi
        call    puts
        nop
        popq    %rbp
        ret   // ==> Here function return value.
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        call    func
Run Code Online (Sandbox Code Playgroud)

为什么函数func()在提供noreturn属性后返回?

c assembly function-call c11 noreturn

71
推荐指数
8
解决办法
1万
查看次数

在GCC没有的情况下,Clang会发出非法指令

我发现了一种情况,在这种情况下,Clang会产生非法指令,gcc没有这样做,同时试验这个问题.

我的问题是:我做错了什么,或者这是Clang的实际问题?

我把它归结为重现问题所需的最小片段.

拿文件eigen.cpp:

#include <iostream>

#define EIGEN_MATRIXBASE_PLUGIN "eigen_matrix_addons.hpp"
#include <Eigen/Dense>

int main() {
    Eigen::Matrix2d A;

    A << 0, 1, 2, 3;

    std::cout << A << "\n";
}
Run Code Online (Sandbox Code Playgroud)

和文件eigen_matrix_addons.hpp:

friend std::ostream &operator<<(std::ostream &o, const Derived &m) {
    o << static_cast<const MatrixBase<Derived> &>(m);
}
Run Code Online (Sandbox Code Playgroud)

(有关此文件的详细说明,请参见此处.简而言之,其内容直接放在类的定义中template<class Derived> class MatrixBase;.因此,这会引入另一个ostream运算符Derived,调用ostream运算符的Eigen实现MatrixBase<Derived>.此动机为此如果你读这个问题就会变得很明显.)

使用GCC编译并运行:

$ g++ -std=c++11 -Wall -Wextra -pedantic -isystem/usr/include/eigen3 -I. -o eigen_gcc eigen.cpp
$ ./eigen_gcc
0 1 …
Run Code Online (Sandbox Code Playgroud)

c++ clang

14
推荐指数
1
解决办法
3770
查看次数

C和C++函数没有return语句

在查看工作代码时,我发现了一些(看似)令人反感的代码,其中函数具有返回类型,但没有返回.我知道代码有效,但认为它只是编译器中的一个错误.

我编写了以下测试并使用我的编译器运行它(gcc(Homebrew gcc 5.2.0)5.2.0)

#include <stdio.h>

int f(int a, int b) {
  int c = a + b;
}

int main() {
   int x = 5, y = 6;

   printf("f(%d,%d) is %d\n", x, y, f(x,y)); // f(5,6) is 11

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

类似于我在工作中发现的代码,这默认返回函数中执行的最后一个表达式的结果.

我发现了这个问题,但对答案不满意.我知道-Wall -Werror可以避免这种行为,但为什么它是一个选项呢?为什么这仍然允许?

c c++ return

9
推荐指数
2
解决办法
9820
查看次数

gcc选项:在没有return语句的情况下对非void函数发出警告

有没有人知道gcc/g ++选项如果某个函数具有非void返回值但在其定义中不包含return语句,则会生成错误/警告?

例如:

int add(int a, int b)
{
    a+b;
}
Run Code Online (Sandbox Code Playgroud)

提前谢谢了!

c++ compiler-construction gcc compiler-errors compiler-warnings

5
推荐指数
1
解决办法
2191
查看次数

为什么即使缺少return语句,C语言中的程序也会编译?

我在C中实现了一些基本的数据结构,我发现如果我从函数中省略了返回类型并调用该函数,则编译器不会生成错误.我编译cc file.c并没有使用-Wall(所以我错过了警告)但在其他编程语言中这是一个严重的错误,程序将无法编译.

根据Graham Borland的要求,这是一个简单的例子:

int test() 
{
  printf("Hi!");
}

int main() 
{ 
    test();
}
Run Code Online (Sandbox Code Playgroud)

c

5
推荐指数
2
解决办法
3336
查看次数

为什么“控制到达非无效函数的末尾”仅是警告?合法吗

用非空返回类型定义函数是否合法,这使控件可以到达函数的末尾而不是返回语句吗?

gcc并且clang仅对此发出警告。这些代码合法吗?或者这些编译器是否慷慨?

gcc:

警告:函数中没有return语句,返回非空[-Wreturn-type]

铛:

警告:控制到达非无效函数的结尾[-Wreturn-type]

如果这是合法的,那么对于返回的值是否存在定义的行为?

c++ return-value compiler-warnings undefined-behavior

5
推荐指数
1
解决办法
1846
查看次数

我忘了从函数中返回值但是当我在函数声明中返回引用时它工作了.为什么?

#include <iostream>
#include<stdlib.h>
using namespace std;

class test{
    public:
    test(int a):i(a){
    }
    int display();
    private:
        int i;
};

int test::display(){
    i;
}
int main() {
    test obj(10);
    cout<<obj.display();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的情况下,打印一些随机值.但是当我将函数声明更改为:

int& display();
Run Code Online (Sandbox Code Playgroud)

和定义为:

int& test::display(){
    i;
}
Run Code Online (Sandbox Code Playgroud)

它显示正确的值,即10我不知道为什么?

c++

5
推荐指数
1
解决办法
111
查看次数

C函数调用:理解"隐式int"规则

如果"a function"是单独编译的,那么就不会检测到不匹配,"函数"会返回一个main,它将main视为一个int ...根据我们所说的声明如何必须匹配定义,这可能会似乎令人惊讶.可能发生不匹配的原因是,如果没有函数原型,则函数通过其在表达式中的第一次出现来隐式声明,例如

    sum += "the function"(line);
Run Code Online (Sandbox Code Playgroud)

如果先前未声明的名称出现在表达式中并且后跟左括号,则上下文将其声明为函数名称,假定该函数返回int,并且不假设其参数.

我事先为这个含糊不清的问题道歉,但这是什么意思?

顺便说一下,这是Brian W. Kernighan和Dennis M. Ritchie的C编程语言书第2版第73页第4.3章.

c function

4
推荐指数
2
解决办法
9392
查看次数

C++编译器 - 忘记了返回语句

我写了一个简单的函数来返回一个字符串让我在屏幕上显示.

static std::string  myFun(int myId){
  std::ostringstream stream;
  int myStatus;
  if(get_status(&myStatus)) stream << get_error();
  else{
    stream << "my status:" << myStatus;
  }
    return stream.str();
}
Run Code Online (Sandbox Code Playgroud)

代码本身可能并不重要.但我把它包含在以防万一.我遇到的问题是因为在我最初的尝试中,我忘了包含return语句

return stream.str();
Run Code Online (Sandbox Code Playgroud)

编译器编译没有错误,但是当我运行它时.该程序不断收到消息

Aborted(core dumped)
Run Code Online (Sandbox Code Playgroud)

我吓坏了,我搜索了stackoverflow并安装了valgrind和一切.然后我检查代码,我意识到我只是忘记包含return语句!我希望编译器能够注意到这些错误.

有人可以向我解释为什么编译器无法检测到错误吗?

c++ compiler-errors

3
推荐指数
1
解决办法
155
查看次数