(注意:请一直阅读,因为我花了一些时间来组织它,确保我解决了我遇到的每个问题以及为什么一个提议的解决方案对我不起作用.)
我在vim中使用cindent来自动进行缩进.它大部分时间都很好用.但是,cindent做了三个坏事(在我看来)涉及C预处理器指令(以哈希('#')开头的语句).
如果它是相关的,我使用标签进行缩进,我的.vimrc包含filetype indent on.
只要我输入一个预处理器指令,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++语句一样处理预处理程序指令.
当我使用预处理器指令使用==(或[movement]=跨越)一行时,vim将其放回第1列.(这与Bad Thing 1一致,但仍然存在问题.)
如果(由于Bad Thing 1或2或使用<<)预处理程序指令最终在第1列中,它会在那里"卡住"并且不受影响>>.增加缩进的唯一方法是I<Tab>或 …
为什么:
#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?
我正在查看一些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吗?难道只有第一个块会被处理吗?
这里有什么不对:
#define CONTROLS_OFFSET 100
#ifdef CONTROLS_OFFSET//Unterminated conditional directive it says
#define FIND_MAIN_MENU 3
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?
#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)
据我所知,min和max函数的定义<algorithm>.
如果我没有告诉预处理器包含<algorithm>为什么代码仍然有效?
假设您要生成标识符和字符串的匹配列表
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不允许你在字符串中放置参数?
这是我想要做的具体例子.
考虑这个string.Join功能.在.NET 4.0之前,只有两个重载,两者都需要一个string[]参数.
从.NET 4.0开始,有一些新的重载采用了更灵活的参数类型,包括IEnumerable<string>.
我有一个库,其中包含一个Join基本上完成.NET 4.0 string.Join功能的功能.我只是想知道我是否可以使这个功能的实现依赖于目标.NET框架.如果是4.0,它可以简单地在string.Join内部调用.如果是3.5或更早,它可以调用自己的内部实现.
string.Join,使用IEnumerable<string>参数调用甚至不会编译 ; 所以无论我使用什么方法都必须在编译之前进行.(Environment.Version例如,在运行时检查属性不起作用.)请解释一下代码
#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宏的包装?
Swift 4.2 有一个特殊的条件canImport,可以帮助开发者检查一个模块是否可以导入到项目中。它是在 Swift 4.1 中引入的。
现在我正在研究用 Objective-C 编写的 iOS 项目。我使用模块,对于每个目标,这些模块都是不同的。这就是为什么我想使用这样的东西:
#if canImport(SomeModule)
@import SomeModule;
#endif
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?现在我为每个目标使用不同的“其他 C 标志”,但我想找到更灵活的解决方案。
c ×3
objective-c ×3
c++ ×2
xcode ×2
.net ×1
c# ×1
frameworks ×1
indentation ×1
macros ×1
module ×1
swift4.1 ×1
vim ×1