我有一些C++代码,并且如果定义了__APPLE__或__linux宏,则想要执行操作.
如果我把它作为一个正常的if条件,它将很容易使用||:
if (something || something) { .. code .. }
Run Code Online (Sandbox Code Playgroud)
但据我所知,没有||运营商的#ifdef陈述.我将如何检查__APPLE__或__linux使用一个单一的定义#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中完成这项工作吗?我不喜欢每次写两次因为没有宏了.
提前致谢
插口
我有一个Android应用程序,有两种形式:试用版和付费"专业版".这两个版本在Android Market中共存,并且具有不同的包名称(我们称之为com.app.trial和com.app.pro).它们共享相同的代码库.当我必须在Eclispe中的试用版和专业版之间切换时,每次编辑代码时我都要花费不少于20分钟来构建正确的版本.我的程序看起来像这样:
在AndroidManifest.xml中重命名包名称(也重命名app versionName和versionCode).
单击主程序包名称"com.app.pro"(如果pro是最新的构建,现在我想进行试验构建)并选择Refactor-> Rename(选中'Update references'和'Rename subpackages')并让Eclipse重命名.
在此之后出现了困难的部分:在我的代码中,许多文件仍导入"旧"软件包名称"com.app.pro",而不是自动更改为"com.app.trial".在某些情况下,Eclipse在重命名期间添加了这些引用,没有明显的原因(在给定的Java文件中没有对此特定包的引用).我必须手动编辑所有实例.
我的问题是:
如何减少耗时?我也一直在使用NetBeans,它提供了对#ifdefs(aka Abilities)的方便支持,它真正使构建之间的切换变得轻而易举.遗憾的是,#ifdefs不支持Eclipse(至少没有内置支持).
任何建议将不胜感激.
PS作为参考,我使用的是Eclipse Ganymede 3.4.2版,但也尝试了更新的版本,它也是如此.
我用于#ifdef Win32安全通话,sprintf_s但现在我想用MinGW建立项目,现在它错了.我需要使用#ifdef VC++或以某种方式.可能吗?
对于用户授权,我只想为每个用户包含一个特定的模块.所以我像这样配置了条件编译
<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知道条件引用,在构建期间通过视觉反馈和错误通知来表达正确的设置.
人们建议大范围#ifdef进行条件编译.一个搜索#ifdef证实,它的使用是很普遍的.
然而#ifdef NAME(或等同#if defined(NAME)和相关#ifndef NAME(和#if !defined(NAME))有一个严重的缺陷:
#ifndef IS_SPECIAL
#error You're not special enough
#endif
Run Code Online (Sandbox Code Playgroud)
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
gcc -DIS_SPECIAL source.cpp
显然,将会通过
#define IS_SPECIAL 1
#include "header.h"
Run Code Online (Sandbox Code Playgroud)
但是,也一样
#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. …
golang是否支持
#define DEBUG
#ifdef DEBUG
fmt.Println("Debug message...");
#endif
Run Code Online (Sandbox Code Playgroud)
所以我可以构建一个零运行时开销的调试版本?
我用伪代码捕获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)
我的问题是:
Makefile中的规则是否可以选择性(使用ifdef选择规则和目标).
回声不起作用.echo应该帮助用户正确使用.
我想编辑一个带有"问题"列表的rmarkdown(Rmd)文档,每个文档后面跟着它的解决方案.每个解决方案可能包含R控制台的结果,但也有一些解释(markdown和LaTeX格式化)文本.此外,我想在两个版本中编写它:使用和不使用解决方案,尽可能少地更改源代码并进行编译.
我知道我可以使用逻辑变量来有条件地评估R代码并显示图和R输出,但我不知道如何显示/隐藏(markdown和LaTeX)格式化文本的块,除非我将所有文本放入R字符向量,这似乎很难保持清洁和可读性.
我找到了老问题
解决方案是为简单的短文本提供的,它包含在R print()函数的参数中.
这是另一个老问题
有一个父亲文件和儿童文件有条件编译,但我不想把我的文件分成这么多块.
在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