【问题标题】:Visual Studio: Macro for checking configuration type (exe/dll)Visual Studio:检查配置类型的宏 (exe/dll)
【发布时间】:2011-12-03 14:44:49
【问题描述】:

是否有一个宏可以用来检查 Visual Studio 中的当前配置类型? 根据当前设置,我想包含一个 main 或 dllmain 函数:

#IFDEF CONFIGURATION_TYPE_EXE

     int main(int argc, char **argv)
     {
       ...
     }
#ELSEIF CONFIGURATION_TYPE_DLL


    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        return TRUE;
    }

#ENDIF

【问题讨论】:

  • 您可以在 Visual Studio 中定义自己的构建配置和预处理器定义来为您执行此操作。
  • 你能定义“当前配置类型”吗,你的意思是发布/调试构建模式吗?
  • @simbolo 不,配置属性 -> 常规中有一个名为“配置类型”的选项,我想检查当前配置(调试/发布)。
  • @helloworld922 我该怎么做?

标签: c++ visual-studio macros


【解决方案1】:

如果是 dll,那么 _WINDLL 将被定义为继承值。你可以在这里找到它:配置属性 -> C/C++ -> 预处理器 -> 预处理器定义。

#ifdef _WINDLL
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ ... }
#else
int main(int argc, char** argv)
{ ... }
#endif

【讨论】:

  • 这比_USRDLL 更可靠,因为它被自动包含的属性表继承。
  • @MatthewHolder 虽然我想知道像 VC6 这样的旧版本是否会自动执行此操作(我很难在网上找到有关它的信息),但似乎与 VS 2008 一样旧的版本也可以执行此操作。顺便说一句,您可以通过单击“预处理器定义”行上的“编辑”并在出现的框中取消选中“从父级或项目默认值继承”来禁用此自动定义。
  • @KeithM,大多数人认为_WINDLL 更可靠的主要原因是它是通过构建系统属性表自动包含的,通常不受用户控制。 _USRDLL 是项目模板的一部分,用户可以在创建项目后将其删除。
  • @Matthew 我认为您没有按照我的意思理解我的评论。我对此很清楚;我担心的是我无法确定_WINDLL 的历史可以追溯到多远。也就是说,VS 2008 + 会自动执行,但我无法确认旧版本的 MSVS 是否会执行。 (该问题未提及特定版本的 MSVS。)
  • @KeithM,啊...我自己也不能肯定,但自从我使用 2005 年之前的 Visual C++ 版本以来已经有好几年了,但我可以确认 2005 年也这样做了.我用过 4 和 6 并且想说他们也这样做了,但这将来自非常非常模糊的记忆,这很容易让我认为不是这种情况。我一直遵循约定为项目的所有配置创建一个通用属性表,它将_CONSOLE 放在控制台应用程序上,_WINDOWS 放在 GUI 应用程序上,_USRDLL 放在 DLL 应用程序上,并让我的团队遵循相同的约定.
【解决方案2】:

如果是 DLL 项目,将定义 _USRDLL。 (请参阅配置属性\预处理器\预处理器定义)。

但要小心,因为该列表是由向导填充的,如果项目是作为其他项目创建然后配置为 DLL,则不会自动更新。此外,如果您正在构建要与 DLL 链接的库,则必须小心。

【讨论】:

  • 我刚刚在我最初作为应用程序创建的项目上尝试了 ifdef _USRDLL。当我切换到配置类型 dll 时,它仍然没有定义。因此,我猜我还必须更改其他项目设置。
猜你喜欢
  • 2015-09-12
  • 2017-12-31
  • 2013-09-27
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
相关资源
最近更新 更多