GVKun编程网logo

php – 如果在连接中间声明?(php连接符使用)

26

对于php–如果在连接中间声明?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍php连接符使用,并为您提供关于.net–从XSLT输出根删除XML名称空间声明?、c–如果在宏中声明变量会发生什

对于php – 如果在连接中间声明?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍php连接符使用,并为您提供关于.net – 从XSLT输出根删除XML名称空间声明?、c – 如果在宏中声明变量会发生什么?、c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?、c – 将名称空间声明为类的朋友的有用信息。

本文目录一览:

php – 如果在连接中间声明?(php连接符使用)

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名称空间声明?

.net – 从XSLT输出根删除XML名称空间声明?

具有以下输入 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 – 如果在宏中声明变量会发生什么?

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内部吗?我可以使用哪些技巧来保证任何类型的唯一性(除了使变量内部有一个乱码,这使得其他人不太可能使用相同的名称)?

(理想情况下,函数对此更有用,但我的特殊情况不允许这样做)

解决方法

宏只执行字符串替换.语义很低,编译器对预处理器的了解有限(实际上#pragma实际上不是预处理器关键字和源代码行信息).

在您的情况下,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关键字?

c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?

假设我有以下功能.
std::mutex mutex;

int getNumber()
{
    mutex.lock();
    int size = someVector.size();
    mutex.unlock();
    return size;
}

这是一个在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,会返回值优化还是别的东西会破坏这段代码? someVector的大小可以从程序拥有的众多线程中的任何一个更改,并且假设只有一个线程(修饰符除外)调用getNumber().

解决方法

您没有提到互斥变量的类型是什么,但假设它是一个std :: mutex(或类似的东西意味着保证互斥),编译器将无法执行大量优化.因此,您无需担心返回值优化或其他一些优化,从而允许在互斥块之外执行size()查询.

但是,只要释放互斥锁,另一个等待线程就可以自由访问该向量并可能使其变异,从而改变大小.现在,您的函数返回的数字已过时.正如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 – 将名称空间声明为类的朋友

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 – 将名称空间声明为类的朋友的相关知识,请在本站寻找。

本文标签: