标签: conditional-compilation

如何检查单个#ifdef中是否定义了多个宏之一?

我有一些C++代码,并且如果定义了__APPLE____linux宏,则想要执行操作.

如果我把它作为一个正常的if条件,它将很容易使用||:

if (something || something) { .. code .. }
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有||运营商的#ifdef陈述.我将如何检查__APPLE____linux使用一个单一的定义#ifdef语句?

c++ conditional-compilation c-preprocessor

15
推荐指数
1
解决办法
2万
查看次数

如何为iOS和OS X编写通用swift代码.在cocoa中我可以使用#ifdef,我现在该怎么办?

对于我们的项目,我们总是为两个平台使用一个源文件:iOS和OS X.现在我正在迁移到swift.不幸的是,有一些文件需要

import Cocoa
Run Code Online (Sandbox Code Playgroud)

在iOS上

import UIKit
Run Code Online (Sandbox Code Playgroud)

以前我们做过

#ifdef __MAC_OS_X_VERSION_MAX_ALLOWED
#import <Cocoa/Cocoa.h>
#else
#import <UIKit/UIKit.h>
#endif
Run Code Online (Sandbox Code Playgroud)

你知道如何在swift中完成这项工作吗?我不喜欢每次写两次因为没有宏了.

提前致谢

插口

import macros preprocessor conditional-compilation swift

15
推荐指数
2
解决办法
2946
查看次数

使用Eclipse中的Android应用程序切换试用版和专业版:如何减轻它的痛苦?

我有一个Android应用程序,有两种形式:试用版和付费"专业版".这两个版本在Android Market中共存,并且具有不同的包名称(我们称之为com.app.trial和com.app.pro).它们共享相同的代码库.当我必须在Eclispe中的试用版和专业版之间切换时,每次编辑代码时我都要花费不少于20分钟来构建正确的版本.我的程序看起来像这样:

  1. 在AndroidManifest.xml中重命名包名称(也重命名app versionName和versionCode).

  2. 单击主程序包名称"com.app.pro"(如果pro是最新的构建,现在我想进行试验构建)并选择Refactor-> Rename(选中'Update references'和'Rename subpackages')并让Eclipse重命名.

  3. 在此之后出现了困难的部分:在我的代码中,许多文件仍导入"旧"软件包名称"com.app.pro",而不是自动更改为"com.app.trial".在某些情况下,Eclipse在重命名期间添加了这些引用,没有明显的原因(在给定的Java文件中没有对此特定包的引用).我必须手动编辑所有实例.

我的问题是:

如何减少耗时?我也一直在使用NetBeans,它提供了对#ifdefs(aka Abilities)的方便支持,它真正使构建之间的切换变得轻而易举.遗憾的是,#ifdefs不支持Eclipse(至少没有内置支持).

任何建议将不胜感激.

PS作为参考,我使用的是Eclipse Ganymede 3.4.2版,但也尝试了更新的版本,它也是如此.

eclipse android versions conditional-compilation building

14
推荐指数
1
解决办法
2673
查看次数

如何通过CompilerType #ifdef?GCC或VC++

我用于#ifdef Win32安全通话,sprintf_s但现在我想用MinGW建立项目,现在它错了.我需要使用#ifdef VC++或以某种方式.可能吗?

c conditional-compilation

14
推荐指数
3
解决办法
2万
查看次数

Visual Studio基于常量的条件项目引用

对于用户授权,我只想为每个用户包含一个特定的模块.所以我像这样配置了条件编译

<DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants>
Run Code Online (Sandbox Code Playgroud)

并编辑了这样的项目文件:

<ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj" Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
  <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
  <Name>Solution1.Modules.Module1</Name>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

对于这种情况,我想补充的参考项目Module1是否DefineConstants包含SAMPLECONSTANT1; 但无论我投入什么DefineConstants,解决方案总是加载Module1项目.我在这做错了什么?

更新:其实我的代码是正确的.请参阅J0e3gan的回答.Visual Studio UI不反映References项目文件夹中的条件引用.因此,在任何给定配置或平台选择中都可以看到所有引用.另一方面,编译器和IntelliSense知道条件引用,在构建期间通过视觉反馈和错误通知来表达正确的设置.

c# reference project conditional-compilation visual-studio

14
推荐指数
1
解决办法
9355
查看次数

为什么人们使用#ifdef进行功能标记测试?

人们建议大范围#ifdef进行条件编译.一个搜索#ifdef证实,它的使用是很普遍的.

然而#ifdef NAME(或等同#if defined(NAME)和相关#ifndef NAME(和#if !defined(NAME))有一个严重的缺陷:

header.h

#ifndef IS_SPECIAL
#error You're not special enough
#endif
Run Code Online (Sandbox Code Playgroud)

source.cpp

#include "header.h"
Run Code Online (Sandbox Code Playgroud)

gcc -DIS_SPECIAL source.cpp

显然,将会通过

source1.cpp

#define IS_SPECIAL 1
#include "header.h"
Run Code Online (Sandbox Code Playgroud)

但是,也一样

source0.cpp

#define IS_SPECIAL 0
#include "header.h"
Run Code Online (Sandbox Code Playgroud)

这是完全错误的事情.而一些C++编译器,传递一个以C模式处理的文件(由于扩展或命令行选项)有效#define __cplusplus 0.我看到事情破裂了

#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

C模式下处理,其中extern "C"语法无效,因为__cplusplus实际上是自动定义的0. …

c c++ conditional-compilation c-preprocessor

14
推荐指数
1
解决办法
4012
查看次数

golang中的C风格条件编译

golang是否支持

#define DEBUG 

#ifdef DEBUG 
  fmt.Println("Debug message..."); 
#endif 
Run Code Online (Sandbox Code Playgroud)

所以我可以构建一个零运行时开销的调试版本?

conditional-compilation go

14
推荐指数
2
解决办法
7604
查看次数

在makefile中使用条件规则

我用伪代码捕获Makefile的意图,然后指出我遇到的问题.我正在寻找一个在测试环境中更加用户友好的Makefile.Makefile的正确用法如下所示.

    make CATEGORY=parser TEST=basic.
    make ALL
Run Code Online (Sandbox Code Playgroud)

如果用户给出"JUST"命令,如下所示,它应该打印一条消息"CATEGORY defined TEST undefined",反之亦然

    make CATEGORY=parser
    make TEST=basic
Run Code Online (Sandbox Code Playgroud)

我尝试以下列方式编写Makefile,但它出错了:

    help:
        echo"Usage: make CATEGORY=<advanced|basic> TEST=<test-case>
        echo"       make ALL

    ifdef CATEGORY
        ifdef TEST
            CATEGORY_TEST_DEFINED = 1
        else
             echo "TEST not defined"
    else
        echo "CATEGORY not defined"
    endif



    ifeq ($(CATEGORY_TEST_DEFINED), 1)
    $(CATEGORY):
        cd $(PROJ)/$(CATEGORY)
        make -f test.mk $(TEST)
    endif

    ifdef ALL
    $(ALL):
         for i in `ls`
         cd $$(i)
         make all
    endif
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. Makefile中的规则是否可以选择性(使用ifdef选择规则和目标).

  2. 回声不起作用.echo应该帮助用户正确使用.

makefile conditional-compilation

13
推荐指数
2
解决办法
6万
查看次数

使用knitr有条件地显示降价文本块

我想编辑一个带有"问题"列表的rmarkdown(Rmd)文档,每个文档后面跟着它的解决方案.每个解决方案可能包含R控制台的结果,但也有一些解释(markdown和LaTeX格式化)文本.此外,我想在两个版本中编写它:使用和不使用解决方案,尽可能少地更改源代码并进行编译.

我知道我可以使用逻辑变量来有条件地评估R代码并显示图和R输出,但我不知道如何显示/隐藏(markdown和LaTeX)格式化文本的块,除非我将所有文本放入R字符向量,这似乎很难保持清洁和可读性.

我找到了老问题

有条件地在R Markdown中显示一个文本块

解决方案是为简单的短文本提供的,它包含在R print()函数的参数中.

这是另一个老问题

使用knitr将降价文档的部分插入另一个降价文档中

有一个父亲文件和儿童文件有条件编译,但我不想把我的文件分成这么多块.

markdown r conditional-compilation knitr r-markdown

13
推荐指数
2
解决办法
2680
查看次数

为什么在$ Delphi XE5中用{$ IF defined(MSWINDOWS)}替换{$ IFDEF MSWINDOWS}?

在XE5中所有条件编译如

{$IFDEF MSWINDOWS} 
Run Code Online (Sandbox Code Playgroud)

被替换为

{$IF defined(MSWINDOWS)}
Run Code Online (Sandbox Code Playgroud)

例如XE4中的System.Diagnostics.pas

...
implementation

{$IFDEF MSWINDOWS}
uses Winapi.Windows;
{$ENDIF}
{$IFDEF MACOS}
uses Macapi.Mach;
{$ENDIF}

{ TStopwatch }
...
Run Code Online (Sandbox Code Playgroud)

现在在XE5中它看起来像:

...
implementation
{$IF defined(MSWINDOWS)}
uses Winapi.Windows;
{$ELSEIF defined(MACOS)}
uses Macapi.Mach;
{$ELSEIF defined(POSIX)}
uses Posix.Time;
{$ENDIF}

{ TStopwatch }
...
Run Code Online (Sandbox Code Playgroud)

是否有任何特殊原因我应该迁移我的类似调用?

delphi conditional-compilation defined conditional-statements delphi-xe5

12
推荐指数
1
解决办法
8875
查看次数