我有一个内部API,我希望其他人在他们的项目中作为编译的DLL引用.当它是一个被引用的独立项目时,我使用条件编译(#if语句)来根据编译符号切换关键Web服务类的行为.问题是,一旦生成了一个程序集,它就会被锁定到最初编译时编译符号的内容 - 例如,如果这个程序集是用DEBUG编译的并且被另一个项目引用,即使另一个项目是作为RELEASE构建,程序集仍然像在DEBUG中一样,因为它不需要重新编译.这是有道理的,只是给出一些背景知识.
现在我正在尝试解决这个问题,以便通过其他方式切换程序集的行为,例如扫描交换机的app/web配置文件.问题是,我正在切换的程序集的一些代码是方法的属性,例如:
#if PRODUCTION
[SoapDocumentMethodAttribute("https://prodServer/Service_Test", RequestNamespace = "https://prodServer", ResponseNamespace = "https://prodServer")]
#else
[SoapDocumentMethodAttribute("https://devServer/Service_Test", RequestNamespace = "https://devServer", ResponseNamespace = "https://devServer")]
#endif
public string Service_Test()
{
// test service
}
Run Code Online (Sandbox Code Playgroud)
虽然可能有一些语法糖允许我以另一种方式在同一类型的两个属性之间翻转,但我不知道.有任何想法吗?
另一种方法是引用整个项目而不是程序集,但如果可以的话,我宁愿坚持引用已编译的DLL.如果需要的话,我也完全乐于采用一种全新的方法来解决问题.
我正在使用旧的C代码,它仍然有一些尘土飞扬的角落.我发现很多关于#ifdef操作系统,体系结构等的陈述,并改变了代码的可移植性.我不知道今天有多少这些陈述仍然有用.
我知道#ifdef在某些情况下这不是最好的主意,我一定会解决这个问题,但我对此感兴趣的是正在测试的内容.
我在下面列出了它们.如果你能告诉我它们中的任何一个在这个时代是否确实有用,或者它们所关联的机器或操作系统早已过期,那就太棒了.此外,如果你知道这些的任何中心参考,我很想听听它.
谢谢你,罗斯
BORLANDC
BSD
CGLE
DRYRUN
HUGE
IBMPC
MAIN
M_XENIX
OPTIMIZED
P2C_H_PROTO
sgi
TBFINDADDREXTENDED
UNIX
vms
__GCC__
__GNUC__
__HUGE__
__ID__
__MSDOS__
__TURBOC__
Run Code Online (Sandbox Code Playgroud) 考虑一下:
#ifndef GUARD_H
#define GUARD_H
...
#endif GUARD_H
Run Code Online (Sandbox Code Playgroud)
而不是:
#ifndef GUARD_H
#define GUARD_H
...
#endif // GUARD_H
Run Code Online (Sandbox Code Playgroud)
我常常看到#endif一个"标识符"已注释掉,但没有评论它仍然有效.
一切都是在#endif悔改之后还是......?
我使用vim/cscope/ctags来浏览C源代码.很多次我发现使用#ifdefs 定义宏是两次甚至更多次,我正在查看我不想要的定义.
所以我的问题是,在vim中是否有任何快捷方式,如果我正在查看的行是在#ifdef宏内,我可以找到它?
我可以使用所有定义的列表,:tselect但我正在寻找一些快捷方式,例如我用于查找我所在功能的一个(下面的示例).
" Show function name
fun! ShowFuncName()
let lnum = line(".")
let col = col(".")
echohl ModeMsg
echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
echohl None
call search("\\%" . lnum . "l" . "\\%" . col . "c")
endfun
map f :call ShowFuncName() <CR>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我需要知道#if定义的用法是否正确,并且知道以这种方式使用它的可能缺点.
#if defined TEST
int foo()
{
return 0;
}
int foo1()
{
return 0;
}
#else
int foo()
{
return 1;
}
int foo1()
{
return 1;
}
#endif
Run Code Online (Sandbox Code Playgroud)
编辑:我正在尝试将此代码用于我正在处理的两个不同平台.
有没有可以删除说#ifdef PRO_VERSION ... #endif代码的实用程序?
请不要告诉我有关Visual Studio编译器标志或XCode视图后处理源的信息.我无法像控制台应用程序那样方便地自动化它.
我在这里要做的是找到一个现有的实用程序,如果它存在.如果不是......我想我必须重新发明轮子.
我想在程序的标题中显示程序是如何编写的.最重要的是,我想展示编译器优化是否开启/关闭.
(范围检查和其他类似的东西也很有趣,但主要是我对编译器优化感兴趣).
知道怎么做吗?
基于Arioch的即用型功能答案:
function CompilerOptimization: Boolean; { Importan note: $O+ has a local scope, therefore, the result of the function reflects only the optimization state at that specific source code location. }
begin
{$IfOpt O+}
Result:= TRUE;
{$Else}
Result:= FALSE;
{$EndIf}
end;
function CompilerOptimizationS: String;
begin
Result:= 'Compiler optimization is ' +
{$IfOpt O+}
'enabled'
{$Else}
'disabled'
{$EndIf}
end;
Run Code Online (Sandbox Code Playgroud)
重要提示:如果您使用{$ O}开关来优化代码片段,则必须将其用作此类子函数,否则,如果仅使用全局开关(在"项目选项"中),则可以将其用作正常(声明)功能.
// {$O+} or {$O-}
procedure TFrmTest.FormCreate(Sender: TObject);
function CompilerOptimizationS: String;
begin
Result:= 'Compiler optimization is ' +
{$IfOpt …Run Code Online (Sandbox Code Playgroud) 我希望能够写出类似的东西
template <typename T> void foo() {
// ...
if (is_nice<T>::value) {
bar_which_is_defined_only_for_nice_types<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译它(g ++ 4.9.3,没有优化)时,我得到了一个投诉bar_which_is_defined_only_for_nice_types.如何在不诉诸2定义的情况下达到预期效果foo()?
我可以用#define 预处理指令内#if和#endif在C#中?
例如
#if !SILVERLIGHT && !__ANDROID__ && !__IOS__
#define SupportsMutex
#endif
Run Code Online (Sandbox Code Playgroud)
它看起来很有效,但我需要确定.有很多关于此的文章,但大部分时间都是在C语境中而不是C# - C#中的预处理程序指令a更加有限.
Visual Studio的突出显示似乎支持它,但根据语言/编译器规范它真的有效吗?
在此MSDN页面提供了以下注意事项:
#define指令不能用于声明常量值,这通常在C和C++中完成.C#中的常量最好定义为类或结构的静态成员.如果你有几个这样的常量,可以考虑创建一个单独的"常量"类来保存它们.
我需要这个,因为#if !SILVERLIGHT && !__ANDROID__ && !__IOS__多次使用 很难管理.
当然,我们也可以添加项目SupportsMutex的"条件编译符号",但这更难管理,透明度更低.
我想别名类型uint到u32默认,但一个标志可以编辑将其改为期间设置usize.代码应该是这样的:
#[cfg(uint='u32') || default]
type uint = u32;
#[cfg(uint='usize')]
type uint = u64;
Run Code Online (Sandbox Code Playgroud)
当我编译时,我可以使用cargo build --uint=usize.我应该怎么做才能使这项工作?