【问题标题】:Control Reaches End Of Non Void Function for Void控制达到 Void 的非 Void 函数的结尾
【发布时间】:2013-07-29 14:13:19
【问题描述】:

好的,我正在尝试在 C++ 的不同线程中运行一个函数。它不接受任何参数,它是一个 void 函数。所以当我看到这个警告说:

warning: function declared 'noreturn' should not
  return [-Winvalid-noreturn]

我很惊讶。我正在为我的线程使用 pthread。这是我的函数的声明:

void* checkLogKext(void*);

这里是我调用函数的地方:

pthread_t t1;
pthread_create(&t1, NULL, &checkLogKext, NULL);

这是我的功能:

void* checkLogKext(void*) {
    ifstream logKext("/LogKextUninstall.command");
    if (logKext.is_open()) {
        // Do something
    }
}

【问题讨论】:

  • 它不是一个 void 函数:它返回 void* 类型的东西(并且需要一个参数)。
  • 哦,我通过在我原本打算做的函数中放置一个无限循环和睡眠来摆脱错误,所以我修复了它,但我不知道它是如何工作的解释一下?

标签: c++ multithreading pthreads void


【解决方案1】:

你的返回类型是void*,如果你不想返回任何东西,它应该是void。你为你的函数所采用的论点也是如此。

void* foo(void*) // this takes a void* as paremeter and is expected to return one too

void foo(void) // doesn't return anything, and doesn't take any parameters either

【讨论】:

  • 但是对于 pthread 函数不是必须是指针类型吗?
  • @InsertNameHere 我不知道 pthread 期望什么,我告诉你的是你的返回类型是 void* ,所以你应该返回一些东西。
  • @InsertNameHere pThread 建议使用pthread_exit(NULL);,但我认为return NULL 应该就可以了
  • @InsertNameHere 如果 phtread 要求返回类型为 void* 并且您不需要返回任何内容,则可以添加 return NULL;
  • 所以我想编译器识别出我的无限循环并意识到该函数会不断运行,因此不需要返回任何东西。非常感谢大家的帮助
【解决方案2】:

您的函数声明说它返回一个 void 指针,但在您向我们展示的代码中并没有这样做,因此编译器会警告您。要么将声明更改为

void checkLogKext(void*);

或者实际上返回一些东西。但我想你的意思实际上是

void checkLogKext();

例如一个不带任何参数且不返回任何内容的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 2022-01-25
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多