目前我们的.net代码不是特定于处理器的,但它依赖于库(Oracle/ODP.Net).我们找到了一个直接编辑csproj文件的解决方案,并根据我们选择的构建配置将引用放入带有Condition子句的项目组中.我们有32位调试/发布和64位调试/发布,并且在构建该配置时正确的程序集是引用.
这在构建时或多或少有效,但它会在Visual Studio(2008)中引起各种怪异.最终结果是相同的组件在引用下显示四次,三个具有黄色感叹号.它还会产生一些我无法摆脱的76个警告.我们试图针对0警告,因为我们想知道什么时候出现新警告,所以这有点问题.
是否有人知道条件引用的解决方案允许它看起来像一个引用(它确实是这样)并且在构建时没有填写我的警告?
我想用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
我希望我的XCode Objective-C项目能够检测它正在构建的配置.我怎样才能做到这一点?
macros xcode objective-c conditional-compilation c-preprocessor
从我之前关于虚拟和多重继承的问题(在跨平台场景中)开始 - 在阅读了一些答案后,我发现我可以通过保留服务器和客户端类来简化我的模型,并用以下内容替换特定于平台的类#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
我有一个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模板中使用预处理器来影响模板本身而不仅仅是模板输出?
在少数系统中,double与long double相同.如何在编译时检测long double是否为扩展精度而不是double,并将其用于条件编译.
我看到libgcc SIZEOF_DOUBLE和SIZEOF_LONG_DOUBLE中存在预定义的宏 但是在不同的工具链中没有可移植的.
有C方法吗?
c compiler-construction gcc compilation conditional-compilation
今天我遇到了一些包含#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 ++编译它没有任何错误,它显然只是忽略了第二个标记).如果它是合法的,第二个令牌是否会产生任何影响?
我有一个代码库需要与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) 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) 我想根据整数的大小有条件地编译代码,但我没有找到一种方法来确定预处理器阶段中整数的大小.
一个想法是使用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,我不想打印它.我只需要区分条件编译的不同整数大小.