#pragma once或包含不在extern func上工作的警卫

123*_*123 1 c++ header visual-studio

我在项目中遇到了一个非常奇怪(且令人讨厌)的链接器错误.

比方说,我有文件KernelExports.h:

#pragma once

extern "C"
{
    DWORD* KeTimeStampBundle;
    DWORD KeGetCurrentProcessType();
    //etc...
}
Run Code Online (Sandbox Code Playgroud)

我然后#include在我的stdafx.h中,然后添加#include "stdafx.h"所有我的*.cpp文件.问题是,现在每当我建我得到的链接错误流:LNK2005: KeTimeStampBundle already defined in stdafx.obj.这不应该发生,因为头文件只包含在一个文件中并受到包含保护的保护.一旦我注释掉整个extern "C"块,错误就会停止,所以我知道这就是导致问题的原因.

更奇怪的是,当我将所有这些源文件添加到它构建的新项目时没有任何问题.我不知道这里有什么问题,任何人都可以启发我吗?

我的IDE是Visual Studio 2008.

Jam*_*lis 5

DWORD* KeTimeStampBundle;
Run Code Online (Sandbox Code Playgroud)

这不会声明一个函数.它声明并定义了一个DWORD*名为的对象KeTimeStampBundle.如果将此头文件包含在多个源文件中,则将具有此对象的多个定义(每个源文件中包含一个头文件).

包括警卫并#pragma once确保在给定的翻译单元(源文件)中仅定义一次.它们对多个翻译单元的定义方式没有影响.