Xcode 4.2 - C++ 包含保护结构

Xcode 4.2 - c++ include guard structure

我使用 include 守卫的方式似乎有问题。大多数时候我的结构是有效的,但在某些情况下,比如下面的代码,我会遇到问题。可能导致问题的原因是我将 header 文件“all.h”用作其他 header 文件的大 collection(如“another.h”和任何需要其他 header 个文件)。

如果文件“another.cpp”中的代码被注释掉,代码将编译,所以沿线的某处有函数“sleepFunc”的重复(我认为),因为我得到以下内容错误:

Apple Mach-O Linker (Id) Error

ld: duplicate symbol sleepFunc(unsigned int) in

/Users/(project path)/.../Another.o and

/Users/(project path)/.../main.o for architecture x86_64

Command /Developer/usr/bin/clang++ failed with exit code 1

我在 Mac OS X Snow Leopard (10.6.8) 上使用 Xcode 4.2 版。

在输入这个post的过程中,我发现了问题,就是我在“another.cpp”中包含了header“all.h”。但是如果我做了我必须做的事情(#include in "another.h", use header "another.h" in file another.cpp),这让我不开心,因为这意味着所有需要其他文件的文件都开始变得混乱。我希望我制作的每个新文件只有一个 header 文件。

(还有一个问题,为什么编译器会复制“sleepFunc”,即使有 include guard???)

是否有更好、更简洁的方法来构造包含保护 and/or 包含?


all.h

#ifndef IncluderTest_all_h
#define IncluderTest_all_h

#include <iostream>
#include <stdlib.h>
#include "Another.h"

void sleepFunc(unsigned milliseconds);

#ifdef _WIN32
#include <windows.h>
void sleepFunc(unsigned milliseconds)
{
    Sleep(milliseconds);
}
#else
#include <unistd.h>
void sleepFunc(unsigned milliseconds)
{
    usleep(milliseconds * 1000); // takes microseconds
}
#endif
#endif

main.cpp

#include "all.h"

int main (int argc, const char * argv[])
{
    sleepFunc(500);
    printf("Hello world!");
    return 0;
}

another.h

#ifndef IncluderTest_another_h
#define IncluderTest_another_h

class Another{
public:
    void spunky();
};

#endif

another.cpp

#include "all.h"

void Another::spunky(){
    printf("Very spunky");
}

因为您在两个 cpp 文件中包含 all.h,所以符号重复。尝试将 sleep 的实现放入第三个 cpp 文件或对函数使用 static void。就我所见而言,包括守卫没问题。