标签: conditional-compilation

条件参考

目前我们的.net代码不是特定于处理器的,但它依赖于库(Oracle/ODP.Net).我们找到了一个直接编辑csproj文件的解决方案,并根据我们选择的构建配置将引用放入带有Condition子句的项目组中.我们有32位调试/发布和64位调试/发布,并且在构建该配置时正确的程序集是引用.

这在构建时或多或少有效,但它会在Visual Studio(2008)中引起各种怪异.最终结果是相同的组件在引用下显示四次,三个具有黄色感叹号.它还会产生一些我无法摆脱的76个警告.我们试图针对0警告,因为我们想知道什么时候出现新警告,所以这有点问题.

是否有人知道条件引用的解决方案允许它看起来像一个引用(它确实是这样)并且在构建时没有填写我的警告?

c# reference conditional-compilation visual-studio-2008

6
推荐指数
1
解决办法
3040
查看次数

基于操作系统的C++条件编译

我想用C++编写一个包含系统调用的跨平台函数.我可以检查哪些条件编译标志来确定编译代码的操作系统是什么?我主要对Windows和Linux感兴趣,使用Visual Studio和GCC.

我认为应该看起来像这样:

void SomeClass::SomeFunction()
{
    // Other code

#ifdef LINUX
    LinuxSystemCall();
#endif

#ifdef WINDOWS
    WindowsSystemCall();
#endif

    // Other code
}
Run Code Online (Sandbox Code Playgroud)

linux windows cross-platform conditional-compilation visual-studio

6
推荐指数
3
解决办法
8138
查看次数

用于配置的XCode预处理器宏?

我希望我的XCode Objective-C项目能够检测它正在构建的配置.我怎样才能做到这一点?

macros xcode objective-c conditional-compilation c-preprocessor

6
推荐指数
1
解决办法
4802
查看次数

使用`#ifdef`或继承进行交叉编译会更好吗?

从我之前关于虚拟和多重继承的问题(在跨平台场景中)开始 - 在阅读了一些答案后,我发现我可以通过保留服务器和客户端类来简化我的模型,并用以下内容替换特定于平台的类#ifdefs(这是我原本打算做的).

使用这段代码会更简单吗?这意味着至少会有更少的文件!缺点是它创造了一个有点"丑陋",并且稍微难以阅读的Foobar课程,因为这里到处#ifdefs都是.请注意,我们的Unix Foobar源代码永远不会传递给编译器,因此它具有相同的效果#ifdef(因为我们还#ifdef用来决定调用哪个特定于平台的类).

class Foobar {
public:
  int someData;

#if WINDOWS
  void someWinFunc1();
  void someWinFunc2();
#elif UNIX
  void someUnixFunc1();
  void someUnixFunc2();
#endif

  void crossPlatformFunc();
};

class FoobarClient : public Foobar;
class FoobarServer : public Foobar;
Run Code Online (Sandbox Code Playgroud)

注意:有些东西(ctor等)遗漏了一个更简单的例子.

更新:

对于那些想要更多地了解这个问题的人,我真的建议浏览相应的邮件列表线程.在第3篇文章开始变得有趣.还有一个相关的代码提交,您可以在此处查看有问题的真实代码.

c++ cross-platform conditional-compilation multiple-inheritance

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

可以在T4模板中使用条件编译符号

我有一个T4模板,与TextTemplatingFilePreprocessor一起使用,生成一个类,然后我可以用它来生成模板的输出.

在T4模板的开头,我导入了几个名称空间.例如

<#@ import namespace="Company.ProductX.Widgets" #>
<#@ import namespace="Company.ProductX.Services" #>
//...
Run Code Online (Sandbox Code Playgroud)

我想使用预处理程序指令将这些导入与另一组命名空间(它们提供相同的接口但与ProductX具有不同的功能)相关联.例如

<#
#if(ProductX)
{
#>
    <#@ import namespace="Company.ProductX.Widgets" #>
    <#@ import namespace="Company.ProductX.Services" #>
    //...
<#
}
#endif
#>
<#
#if(ProductY)
{
#>
    <#@ import namespace="Company.ProductY.Widgets" #>
    <#@ import namespace="Company.ProductY.Services" #>
    //...
<#
}
#endif
#>
Run Code Online (Sandbox Code Playgroud)

使用上面的示例,无论预处理程序指令如何,导入似乎都会在类中创建相应的using语句.例如

using Company.ProductX.Widgets
using Company.ProductX.Services
using Company.ProductY.Widgets
using Company.ProductY.Services
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法可以在T4模板中使用预处理器来影响模板本身而不仅仅是模板输出?

t4 conditional-compilation

6
推荐指数
1
解决办法
972
查看次数

如何在编译时检测long double是否具有扩展精度

在少数系统中,double与long double相同.如何在编译时检测long double是否为扩展精度而不是double,并将其用于条件编译.

我看到libgcc SIZEOF_DOUBLESIZEOF_LONG_DOUBLE中存在预定义的宏 但是在不同的工具链中没有可移植的.

有C方法吗?

c compiler-construction gcc compilation conditional-compilation

6
推荐指数
1
解决办法
268
查看次数

#ifdef有多个令牌,这是合法的吗?

今天我遇到了一些包含#ifdef子句的C++代码,如下所示:

#ifdef DISABLE_UNTIL OTHER_CODE_IS_READY
   foo();
#endif
Run Code Online (Sandbox Code Playgroud)

请注意"DISABLE_UNTIL"和"OTHER_CODE_IS_READY"之间的空格.基本上#ifdef行中指定了两个标记.

我的问题是,这是合法的C++代码吗?(g ++编译它没有任何错误,它显然只是忽略了第二个标记).如果它是合法的,第二个令牌是否会产生任何影响?

c++ conditional-compilation language-lawyer c-preprocessor

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

是否有#ifdef来区分Swift中的Xcode 6.4和Xcode 7 beta?

我有一个代码库需要与Xcode 7 beta和Xcode 6.4兼容.这是因为beta测试和App Store构建应该使用稳定版本的编译器和SDK构建,但我在用于测试的手机上也有iOS 9 beta.

这对于Objective-C来说不是问题,但是现在我添加了一些Swift,我发现很难保持与两个版本的Xcode的兼容性.

我能做什么?

我知道Swift有一个#ifdef指令,但#ifdef是否可以区分Swift 1.2和2.0?除了DEBUG,os和arch之外,我找不到Swift的有效列表.

这是我的意思的一个例子:

#ifdef __IPHONE_9_0
    some Swift code that works in Swift 2.0 but won't compile in Swift 1.2
#else
    some Swift code that works in Swift 1.2 but won't compile in Swift 2.0
#endif
Run Code Online (Sandbox Code Playgroud)

或者更具体的例子:

public final class MessageParser : NSObject {

    #ifdef __IPHONE_9_0
    static let sharedHashtagRegex = try! NSRegularExpression(pattern:"(^|\\W)(#|\\uFF03)(\\w*\\p{L}\\w*)", options:[]);
    #else
    static let sharedHashtagRegex = NSRegularExpression(pattern:"(^|\\W)(#|\\uFF03)(\\w*\\p{L}\\w*)", options:nil, error:nil)!
    #endif

    // ...
}
Run Code Online (Sandbox Code Playgroud)

conditional-compilation ios swift

6
推荐指数
1
解决办法
1248
查看次数

编译函数是否可用的不同代码

Windows仅向Windows Vista提供GetTickCount,并从该操作系统开始提供GetTickCount64.如何通过调用不同的函数来编译C程序?

如何让C编译器检查是否在包含的头文件中声明了一个函数,并根据该特定函数是否可用来编译代码的不同部分?

#if ??????????????????????????????
unsigned long long get_tick_count(void) { return GetTickCount64(); }
#else
unsigned long long get_tick_count(void) { return GetTickCount(); }
#endif
Run Code Online (Sandbox Code Playgroud)

寻找工作样本文件而不仅仅是提示.

编辑:我在(64位)Windows 7 RC上使用minGW中的gcc 3.4.5尝试了以下操作,但它没有帮助.如果这是MinGW问题,我该如何解决这个问题?

#include <windows.h>
#if (WINVER >= 0x0600)
unsigned long long get_tick_count(void) { return 600/*GetTickCount64()*/; }
#else
unsigned long long get_tick_count(void) { return 0/*GetTickCount()*/; }
#endif
Run Code Online (Sandbox Code Playgroud)

c macros conditional-compilation c-preprocessor

5
推荐指数
2
解决办法
4826
查看次数

C89在预处理器时确定int的大小

我想根据整数的大小有条件地编译代码,但我没有找到一种方法来确定预处理器阶段中整数的大小.

一个想法是使用INT_MAX并将其与常量进行比较:

#if INT_MAX >= 9223372036854775807UL
    printf("64 bit\n");
#elif INT_MAX >= 2147483647UL
    printf("32 bit\n");
#else
    printf("16 bit\n");
#endif
Run Code Online (Sandbox Code Playgroud)

但我不认为UL文字可以那么大.而且ULL是不是在C89可用作据我所知.

那你对如何解决这个问题有什么建议吗?是否有一个宏在一些标准头文件中包含int的大小?

编辑:

不是这个问题的重复,因为我实际上不需要通用sizeof,我不想打印它.我只需要区分条件编译的不同整数大小.

c macros conditional-compilation c89 c-preprocessor

5
推荐指数
1
解决办法
348
查看次数