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。就我所见而言,包括守卫没问题。
我使用 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。就我所见而言,包括守卫没问题。