【问题标题】:using #ifdef block inside exported C++ function in DLL在 DLL 中导出的 C++ 函数中使用 #ifdef 块
【发布时间】:2014-10-01 23:24:51
【问题描述】:

我正在尝试在导出到 DLL 的函数中使用 #ifdef 开关

我遇到的问题是我的 .EXE 项目无法更改 ifdef 定义。就像它们被预编译到 DLL 中一样,无法更改。它是否正确?我不能在导出到 DLL 的 C++ 函数中使用 #ifdef。

示例:

void API func()
{
   #ifdef I_WANT_THIS
      cout << "I want this" << endl;      
   #else
      cout << "I dont want this" << endl;
   #endif
}

如果我在构建 DLL 时没有定义任何内容,然后在 .EXE 项目中我尝试定义,I_WANT_THIS 它实际上并不适用于库中链接的 cpp 目标文件。我认为应该是这样,但我觉得我应该能够做到这一点......

【问题讨论】:

    标签: c++ dll visual-studio-2013


    【解决方案1】:

    您需要使这种功能在运行时可切换。 DLL 是已编译的代码,并且在构建它们时已经执行了任何类似的预处理。

    【讨论】:

    • k,这就是我的想法。谢谢
    【解决方案2】:

    是的,它们被预编译到 DLL 的代码中。 EXE 无法更改它们。要执行您正在尝试的操作,您必须:

    1. 向函数传递一个额外的参数:

      void API func(bool param)
      {
          if (param)
              cout << "I want this" << endl;      
          else
              cout << "I dont want this" << endl;
      }
      
    2. 导出两个单独的函数:

      void API doThis()
      {
         cout << "I want this" << endl;      
      }
      
      void API doThat()
      { 
          cout << "I want that" << endl;      
      } 
      

    【讨论】:

    • 是的,我的问题旨在减少不必要的依赖。例如,如果我有一个 Win32 应用程序类,还有一个 SDL 应用程序类,如果我什至不想与 SDL 链接怎么办?我想我已经有了新的答案:在没有 SDL 的情况下编译我的库以使其不依赖它。
    • 如何编译两个独立的 DLL,一个用于 Win32,一个用于 SDL,并让应用程序选择使用哪一个?如果您希望它们共享一个公共代码库,则可以在编译 DLL 时使用您的#ifdefs。
    • 真的,我能做到。我可能真的会走那条路。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多