标签: preprocessor-directive

使vim indent C预处理程序指令与其他语句相同

基本信息

(注意:请一直阅读,因为我花了一些时间来组织它,确保我解决了我遇到的每个问题以及为什么一个提议的解决方案对我不起作用.)

我在vim中使用cindent来自动进行缩进.它大部分时间都很好用.但是,cindent做了三个坏事(在我看来)涉及C预处理器指令(以哈希('#')开头的语句).

如果它是相关的,我使用标签进行缩进,我的.vimrc包含filetype indent on.

坏事1

只要我输入一个预处理器指令,vim就会将它放在第1列(它完全取消缩进).例如,是我输入代码时vim对我的代码所做的事情:

int main(void)
{
    while(1) {
        /* normal things */
#ifdef DEBUG
        printDebugInfo();
#endif
        /* normal things */
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望它看起来像这样:

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我更喜欢vim像任何其他C/C++语句一样处理预处理程序指令.

坏事2

当我使用预处理器指令使用==(或[movement]=跨越)一行时,vim将其放回第1列.(这与Bad Thing 1一致,但仍然存在问题.)

坏事3

如果(由于Bad Thing 1或2或使用<<)预处理程序指令最终在第1列中,它会在那里"卡住"并且不受影响>>.增加缩进的唯一方法是I<Tab>或 …

c vim indentation preprocessor-directive

18
推荐指数
1
解决办法
1458
查看次数

Xcode中#elseifdef的预处理指令无效

为什么:

 #ifdef SOME_TARGET_FLAG     
      <some code here>
    #elseifdef SOME_ANOTHER_TARGET_FLAG
      <some another code here>
    #endif
Run Code Online (Sandbox Code Playgroud)

生成"无效的预处理指令"预处理编译错误?

SOME_TARGET_FLAG和SOME_ANOTHER_TARGET_FLAG只是目标构建设置(-D<FLAG_NAME>模式)中定义的一些"其他C标志" .

#elseifdef指令不被支持的Xcode?

xcode objective-c c-preprocessor preprocessor-directive

17
推荐指数
1
解决办法
9863
查看次数

为什么有人会使用#if 1 C预处理器指令?

我正在查看一些C源代码,我不明白以下部分

#if 1

   typedef unsigned short PronId;
   typedef unsigned short LMId;
#  define LM_NGRAM_INT

#else

   typedef unsigned int LMId;
   typedef unsigned int PronId;
#  undef LM_NGRAM_INT

#endif
Run Code Online (Sandbox Code Playgroud)

有人会这样做#if 1吗?难道只有第一个块会被处理吗?

c-preprocessor preprocessor-directive

16
推荐指数
4
解决办法
1万
查看次数

Xcode中未终止的条件指令

这里有什么不对:

#define CONTROLS_OFFSET 100
#ifdef  CONTROLS_OFFSET//Unterminated conditional directive it says
#define FIND_MAIN_MENU 3
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?

xcode objective-c preprocessor-directive

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

为什么即使我没有#include <algorithm>,仍然可以使用std :: max和std :: min?

#include <iostream>

int main()
{
   int value1 = 1, value2 = 10;
   std::cout << "Min = " << std::min(value1,value2) <<std::endl;
   std::cout << "Max = " << std::max(value1,value2)<< std::endl;              
} 
Run Code Online (Sandbox Code Playgroud)

据我所知,minmax函数的定义<algorithm>.

如果我没有告诉预处理器包含<algorithm>为什么代码仍然有效?

c++ include-guards preprocessor-directive

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

制作C标识符和字符串?

假设您要生成标识符和字符串的匹配列表

enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};

myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");
Run Code Online (Sandbox Code Playgroud)

..没有重复自己,没有自动生成代码,使用C/C++宏

初步猜测:

您可以添加包含的#include文件

myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)
Run Code Online (Sandbox Code Playgroud)

然后使用它两次,如:

#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine

#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine
Run Code Online (Sandbox Code Playgroud)

但#define不允许你在字符串中放置参数?

c c-preprocessor preprocessor-directive

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

我可以根据.NET框架版本制作预处理程序指令吗?

这是我想要做的具体例子.

考虑这个string.Join功能.在.NET 4.0之前,只有两个重载,两者都需要一个string[]参数.

从.NET 4.0开始,有一些新的重载采用了更灵活的参数类型,包括IEnumerable<string>.

我有一个库,其中包含一个Join基本上完成.NET 4.0 string.Join功能的功能.我只是想知道我是否可以使这个功能的实现依赖于目标.NET框架.如果是4.0,它可以简单地在string.Join内部调用.如果是3.5或更早,它可以调用自己的内部实现.

  1. 这个想法有意义吗?
  2. 如果它确实有意义,那么最合乎逻辑的方法是什么?我想我只是假设一个预处理器指令最有意义,因为当针对早于4.0的.NET版本时string.Join,使用IEnumerable<string>参数调用甚至不会编译 ; 所以无论我使用什么方法都必须在编译之前进行.(Environment.Version例如,在运行时检查属性不起作用.)

.net c# frameworks c-preprocessor preprocessor-directive

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

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

在宏中使用#

请解释一下代码

#include <stdio.h>
#define A(a,b) a##b
#define B(a) #a
#define C(a) B(a)

main()
{
 printf("%s\n",C(A(1,2)));
 printf("%s\n",B(A(1,2)));
}
Run Code Online (Sandbox Code Playgroud)

产量

12

A(1,2)

我不明白,第一个printf如何评估为12?是不是与第二个类似,因为C宏只是B宏的包装?

c macros preprocessor-directive

11
推荐指数
2
解决办法
1593
查看次数

Swift 在 Objective-C 中的 canImport 模拟

Swift 4.2 有一个特殊的条件canImport,可以帮助开发者检查一个模块是否可以导入到项目中。它是在 Swift 4.1 中引入的。

现在我正在研究用 Objective-C 编写的 iOS 项目。我使用模块,对于每个目标,这些模块都是不同的。这就是为什么我想使用这样的东西:

#if canImport(SomeModule)
@import SomeModule;
#endif
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?现在我为每个目标使用不同的“其他 C 标志”,但我想找到更灵活的解决方案。

module objective-c preprocessor-directive swift4.1

11
推荐指数
1
解决办法
1110
查看次数