尚未声明愚蠢的C ++语法

时间:2014-02-05 15:41:25

标签: c++ qt inheritance namespaces cross-compiling

我正在尝试使用最初为Windows编写的Qt C ++项目,并将其交叉编译为嵌入式Linux。现在这个程序在Windows上编译查找和工作,所以这个问题必须是特定于操作系统的东西(我认为不会发生Qt代码)或配置相关,但我很难跟踪它,因为我没有完全理解C ++语法。

我的make命令:

  

arm-linux-gnueabihf-g ++ -c -march = armv7-a -marm -mthumb-interwork   -mfloat-abi = hard -mfpu = neon -mtune = cortex-a8 -O2 -O3 -Wall -W -D_REENTRANT -DCHL80Net -DPHASE_TO_NEUTRAL -DCHL80NET -DCANLCD_BUILD -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I ../ mkspecs / qws / linux-am335x-g ++ -I。 -I ../include / QtCore -I ../include/QtGui -I ../include/QtXml -I ../ include -I。 -IApp -IApp / Model / ModelSim -IApp / Model -I。 -IPages -IApp / GUI / Widgets -IApp / GUI / Pages -IApp / GUI -IApp / GUI / Widgets -IApp / GUI / Pages / Util -IApp / GUI / Pages -IApp / Log4Qt -I.obj -o .obj /CanInterface.o App / Can / CanInterface.cpp

错误:

  

App / Can / CanInterface.cpp:在成员函数'void中   CanInterface :: closeConnection()':App / Can / CanInterface.cpp:68:5:   错误:':: close'尚未声明为make: * [.obj / CanInterface.o]
  错误1

以下是有问题的代码行:

void CanInterface::closeConnection()
{
    ::close(m_socket);
    m_socket = -1;

我认为这开始看起来并不像有效的代码,但我真的不懂C ++所以我不得不做一些研究,似乎这个::function()语法是为了确保解决问题从全局命名空间而不是本地命名空间。

所以我想知道的是命名空间应该声明这个close()函数。如果我对这段代码的理解是正确的,我不需要在CanInterface类中查找未声明的函数,但它是父类?

CanInterface类的头文件中,我发现了这个:

class CanInterface : public QObject 
{
        Q_OBJECT

认为意味着它来自QObject类的inharents。所以:

  1. 我是否走在正确的轨道上?
  2. 我如何知道是否需要查看QObject类以查找缺失的close()函数,或者我是否需要继续运行? ::close以某种方式告诉我需要搜索多少层嵌套类?
  3. 进一步调查此问题的其他任何想法或提示?

2 个答案:

答案 0 :(得分:4)

你是对的,因为::some_function()从全局范围调用一个函数。

这包括所有C库或系统功能。您可以使用man在* nix系统上查找全局函数,例如

man close

在我的Ubuntu上提供

NAME
       close - close a file descriptor

SYNOPSIS
       #include <unistd.h>

       int close(int fd);

因此,要修复编译错误,必须在C ++源代码或周围的头文件中包含unistd.h

当你谷歌搜索man close时,你可以获得相同的信息。 http://linux.die.net/man/2/close

答案 1 :(得分:3)

C ++封装名称空间中的名称以避免命名冲突。这有点类似于C实践,即将特定于库的前缀添加到该库中的函数名称,例如,C中的my_library_foo()可能在C ++中被称为my_library::foo()。当::出现在名称的开头时,意味着名称​​完全限定:从全局命名空间开始查找它,而不是当前/封闭的命名空间,就像绝对名称一样(/etc/passwd/)与相对(foo/bar)文件名。

因此名称::close旨在解析为全局命名空间中声明的close函数,即将<unistd.h>包含在POSIX系统中的那个函数。