Tag: 条件编译

C预处理器宏 – 基于参数连接的条件

我需要有关宏的帮助! 假设我已经定义了以下常量 #define foo_tacos_tuesday 1 #define foo_tacos 1 #define foo_nachos_wednesday 2 #define foo_nachos 3 我想编写一个执行以下操作的宏 #define MyFancyMacro( arg1, arg2 ) \ #if ( foo_ ## arg1 ## _ ## arg2 != foo_ ## arg1 ) \ foo_ ## arg1 ## _ ## arg2, foo_ ## arg1, 所以我可以设置一个只映射不匹配值的映射表: static const int mappingTable[] = { MyFancyMacro(tacos, tuesday) […]

使用`#ifdef`时,Visual Studio错误地标记非活动代码块

我的项目有很多#ifdefs 。 这些#ifdef使用的宏通常使用’/D’选项通过命令行传递,以获得不同的构建配置。 Visual Studio错误地假设未定义这些宏并使这些#ifdef存在的代码块变灰。 问题不在于语法高亮 – 我可以将灰色代码转换为选项中的彩色代码; 主要问题是我无法转到#ifdef存在的任何函数的函数定义。 我尝试阅读Visual Studio 提示文件,但这对我不起作用。 任何人都可以帮我解决这个问题吗? 我正在使用Visual Studio 2008。

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

人们建议#ifdef进行大范围的条件编译 。 搜索#ifdef证实它的使用是普遍的。 然而#ifdef NAME (或等效的#if defined(NAME)和相关的#ifndef NAME (和#if !defined(NAME) )有一个严重的缺陷: header.h #ifndef IS_SPECIAL #error You’re not special enough #endif source.cpp #include “header.h” gcc -DIS_SPECIAL source.cpp 显然,将会通过 source1.cpp #define IS_SPECIAL 1 #include “header.h” 但是,也一样 source0.cpp #define IS_SPECIAL 0 #include “header.h” 这是完全错误的事情。 一些C ++编译器,传递一个以C模式处理的文件(由于扩展或命令行选项)有效地执行#define __cplusplus 0 。 我看到事情破裂了 #ifdef __cplusplus extern “C” { #endif /* … […]

我应该为OS X特定代码使用什么C预处理器条件?

我应该为OS X特定代码使用什么C预处理器条件? 如果我正在编译OS X,我需要包含一个特定的库,如果我正在编译Linux,我需要包含一个不同的头。 我知道有__APPLE__但我不知道这是否是OS X 10.x的当前条件。

根据环境选择C二进制文件

我已经使用特定标志(-Os,-O2,-march = native及其组合)编译了我的代码,以便产生更快的执行时间。 但我的问题是我不会总是在同一台机器上运行(因为在我的实验室中有几台不同的机器)。 有时我在MacOS或Linux内运行(在两种情况下都有不同的OS版本)。 我想知道是否有办法确定运行哪个二进制文件,具体取决于二进制文件运行的环境(我的意思是缓存大小,cpu核心,以及有关特定机器的其他属性)? 换句话说,如何根据所使用的特定机器选择(当程序加载时)更快的二进制文件(以前使用不同的目标二进制文件大小和指令集扩展编译)? 提前致谢。

我可以定义一个环境变量并在条件编译中使用它吗?

我知道我可以在* .h文件中执行此操作: #ifdef _DEBUG #pragma comment(lib, “libtiffd.lib”) #else #pragma comment(lib, “libtiff.lib”) #endif 但我想要一种方法,我可以做这样的事情: #ifdef V2.4.6 #ifdef _DEBUG #pragma comment(lib, “opencv_calib3d246d.lib”) #else #pragma comment(lib, “opencv_calib3d246.lib”) #endif #else #ifdef _DEBUG #pragma comment(lib, “opencv_calib3d249d.lib”) #else #pragma comment(lib, “opencv_calib3d249.lib”) #endif #endif 和V2.4.6是一个环境变量。 我可以这样做吗? 我不想在Visual Studio或代码中定义V2.4.6,因为它在不同的系统上会有所不同。

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

我使用#ifdef Win32来安全调用sprintf_s但现在我想用MinGW构建项目,现在它错了。 我需要使用#ifdef VC++或者某种方式。 可能吗?

使用#ifdefs和#define可选择将函数调用转换为注释

有可能做这样的事情 #ifdef SOMETHING #define foo // #else #define foo MyFunction #endif 我们的想法是,如果定义了SOMETHING,那么对foo(…)的调用将成为注释(或者不会被评估或编译的内容),否则它将成为对MyFunction的调用。 我见过__noop,但我不相信我可以使用它。 编辑(S): 我不认为我真的可以在这里使用宏,因为MyFunction采用可变数量的参数。 另外,我想这样做,所以不评估参数! (所以做一些事情,比如评论MyFunction的主体并没有真正给我我需要的东西,因为参数仍将被评估)