对于php–如果在连接中间声明?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍php连接符使用,并为您提供关于.net–从XSLT输出根删除XML名称空间声明?、c–如果在宏中声明变量会发生什
对于php – 如果在连接中间声明?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍php连接符使用,并为您提供关于.net – 从XSLT输出根删除XML名称空间声明?、c – 如果在宏中声明变量会发生什么?、c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?、c – 将名称空间声明为类的朋友的有用信息。
本文目录一览:- php – 如果在连接中间声明?(php连接符使用)
- .net – 从XSLT输出根删除XML名称空间声明?
- c – 如果在宏中声明变量会发生什么?
- c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?
- c – 将名称空间声明为类的朋友
php – 如果在连接中间声明?(php连接符使用)
$given_id = 1; while ($row = MysqL_fetch_array($sql)) { if ($i < 10){ $display = '<a href="' . $row['info'] . '" onMouSEOver="' . if($row['type']=="battle"){ . 'showB' . } else { . 'showA'() . "><div_alert" . '"id="' . $given_id . '"></div></a>';
解决方法
更好的解决方案是使用速记三元操作
(conditional expression)?(ouput if true):(output if false);
这也可以用于字符串的连接.示例:
$i = 1 ; $result = 'The given number is'.($i > 1 ? 'greater than one': 'less than one').'. So this is how we cuse ternary inside concatenation of strings';
您也可以使用嵌套的三元运算符:
$i = 0 ; $j = 1 ; $k = 2 ; $result = 'Greater One is'. $i > $j ? ( $i > $k ? 'i' : 'k' ) : ( $j > $k ? 'j' :'k' ).'.';
.net – 从XSLT输出根删除XML名称空间声明?
<?xml version="1.0" encoding="utf-8" ?> <customSettings xmlns:env="urn:schemas-test-env"> <connectionStrings> <add name="Name" connectionString="None" providerName="" /> <add name="Name" connectionString="Local" providerName="" env:name="Local" /> <add name="Name" connectionString="Dev" providerName="" env:name="Dev" /> </connectionStrings> <appSettings> <add key="Name" value="Value" /> <add key="Name" value="Local" env:name="Local" /> <add key="Name" value="Dev" env:name="Dev" /> </appSettings> </customSettings>
和XSLT:
<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:code="urn:schemas-test-code" xmlns:env="urn:schemas-test-env" > <xsl:output version="1.0" encoding="utf-8" omit-xml-declaration="yes" indent="yes" /> <xsl:strip-space elements="*" /> <!-- Populate param value --> <xsl:param name="env" select="code:GetEnvironment()" /> <!-- copy content as is --> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template> <!-- Remove all add nodes with env:name not matching param --> <xsl:template match="add"> <xsl:if test="not(@env:name != $env)"> <xsl:call-template name="identity" /> </xsl:if> </xsl:template> <!-- Remove all env:name attributes --> <xsl:template match="@env:name" /> </xsl:stylesheet>
我得到以下输出XML:
<customSettings xmlns:env="urn:schemas-test-env"> <connectionStrings> <add name="Name" connectionString="None" providerName="" /> <add name="Name" connectionString="Local" providerName="" /> </connectionStrings> <appSettings> <add key="Name" value="Value" /> <add key="Name" value="Local" /> </appSettings> </customSettings>
如何从根元素中删除命名空间声明?
<!-- copy content as is --> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template>
有了这两个模板:
<!-- copy elements without copying their namespace declarations --> <xsl:template match="*" name="identity"> <xsl:element name="{name()}"> <xsl:apply-templates select="node()|@*" /> </xsl:element> </xsl:template> <!-- copy content as is --> <xsl:template match="node()|@*" priority="-2"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template>
那应该这样做.
c – 如果在宏中声明变量会发生什么?
#define FOO(x,y) \ do { int a,b; a = f(x); b = g(x); y = a+b; } while (0)
扩展宏时,GCC是否“保证”a,b的任何一种唯一性?我的意思是,如果我以下列方式使用FOO:
int a = 1,b = 2; FOO(a,b);
之后,预处理将是:
int a = 1,b = 2; do { int a,b; a = f(a); b = g(b); b = a+b; } while (0)
编译器可以/将区分do {}外部和do内部吗?我可以使用哪些技巧来保证任何类型的唯一性(除了使变量内部有一个乱码,这使得其他人不太可能使用相同的名称)?
(理想情况下,函数对此更有用,但我的特殊情况不允许这样做)
解决方法
在您的情况下,a和b不是初始化的本地值.行为是不可预测的.
您的扩展代码等效于以下代码.
int a = 1,b = 2; do { int a___,b___; a___ = f(a___); b___ = g(b___); b___ = a___+b___; } while (0)
为了避免这种情况,c更喜欢使用内联函数或模板.
如果使用符合c 1999标准的编译器,则可以使用c语言内联.
http://en.wikipedia.org/wiki/Inline_function
在c中,您可以通过()定义更长的变量和周围参数来制作更安全的宏:
#define FOO(x,y) \ do { int FOO__a,FOO__b; FOO__a = f(x); FOO__b = g(x); y = FOO__a+FOO__b + (y)*(y); } while (0)
注意:我通过添加(y)*(y)来改变你的例子来说明这种情况
仅使用一次宏参数也是一种好习惯.
这可以防止这样的副作用:
#define max(a,b) a>b?a:b max(i++,--y)
Max不会返回你想要的东西.
c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?
std::mutex mutex; int getNumber() { mutex.lock(); int size = someVector.size(); mutex.unlock(); return size; }
这是一个在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,会返回值优化还是别的东西会破坏这段代码? someVector的大小可以从程序拥有的众多线程中的任何一个更改,并且假设只有一个线程(修饰符除外)调用getNumber().
解决方法
但是,只要释放互斥锁,另一个等待线程就可以自由访问该向量并可能使其变异,从而改变大小.现在,您的函数返回的数字已过时.正如Mats PeteRSSon在他的answer中提到的,如果这是一个问题,则需要getNumber()的调用者获取互斥锁,并保持直到调用者使用结果完成.这将确保矢量的大小在操作期间不会改变.
对于涉及异常,多个返回语句等更复杂的函数,显式调用mutex :: lock后跟mutex :: unlock很快变得不可行.更容易的替代方法是使用std :: lock_guard来获取互斥锁.
int getNumber() { std::lock_guard<std::mutex> l(mutex); // lock is acquired int size = someVector.size(); return size; } // lock is released automatically when l goes out of scope
c – 将名称空间声明为类的朋友
特别是,我有一个类,例如:
class C { private: // ... public: // ... friend C* B::f1(C*); friend C* B::f2(C*); friend C* B::f3(C*); friend C* B::f4(C*); friend C* B::f5(C*); };
和一个命名空间B为:
namespace B { C* f1(C* x); C* f2(C* x); C* f3(C* x); C* f4(C* x); C* f5(C* x); };
现在,我宁愿避免在类定义中写入5行,使命名空间B的所有五个函数都与C类通信,并告诉编译器,命名空间B中定义的所有函数都是类C的朋友(即可以访问其私人成员).
一个快速的修复我想是将命名空间更改为一个类,并将这些函数定义为其静态成员,然后将类B声明为类C的朋友.但是,出于好奇,我想知道这样的事情是否可以使用命名空间好吗?
提前致谢.
解决方法
你最接近的是你提出的解决方案,使这些功能成为一个类的静态成员,并且与类相交.但是再一次,为什么不把它们变成原来的静态成员(你的代码中的C)呢?
除此之外,如果我在代码中遇到了这么多朋友的功能,那么会让我再想想我的设计,我会把它作为一个迹象,我在做错事.
关于php – 如果在连接中间声明?和php连接符使用的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.net – 从XSLT输出根删除XML名称空间声明?、c – 如果在宏中声明变量会发生什么?、c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?、c – 将名称空间声明为类的朋友的相关知识,请在本站寻找。
本文标签: