C++使用g++在if条件中定义一个静态变量
C++ define a static variable in if condition using g++
以下宏在Vistual Studio C++中编译(不限于如下所示):
#define LogMacro(ChannelID)
if(static ChannelSettingStruct* channel_settings = SingletonClass()->Instance()->GetSettings(ChannelID))
... use channel_settings to determine the settings of a channel/component and log accordingly...
... for example if logging for a channel is enabled or disabled ...
... if all the conditions are true then write log to file using the macro below. Just like std::cout it uses << operator to pump char to stream ...
LogToFileMacro(channel ...)
上面宏的用法:
LogMacro("ExampleChannel") << "Some text to log" ;
- 通道ID用于通过通道区分日志,例如通道1、通道2
- 上面的宏在Visual Studio中工作
- 我使用宏来减少函数调用的次数
- 如果可以的话,我会毫不犹豫地避开宏。但我不得不使用宏
问题:
然而,当我使用g++编译器时,相同的宏会引发以下错误:
错误:decl说明符在条件中无效
这是因为g++不允许在if条件中声明静态变量。我之所以将变量"channel_settings"设置为静态,是因为我认为它会导致每个ChannelID有一个副本。不过,我对此并不确定。
我的目标是在宏中定义一个指针变量,这样当我再次调用同一个宏时,编译器就不会因为重新定义该变量而引发错误。就像在Visual Studio C++中一样。
g++不允许这样做。
g++编译器有什么问题吗?
我的目标是在宏中定义一个静态变量,这样当我再次调用同一个宏时,编译器就不会因为重新定义该变量而引发错误。
这不是宏的工作方式。当您有一个宏时,它会直接替换行的文本-宏与宏的内容一起使用。如果在多个位置调用宏,则将重新定义变量。
在C++中,这通常可以使用一个函数来解决,并声明一个函数的局部静态变量。
这没有任何意义。即使宏以这种方式工作(它们不会,但即使它们会),代码也不会有任何用途。
在if()
条件中声明一个变量的目的是使该变量可以在下面访问。例如,
if (int rc = function())
std::cout << "Function failed, rcode = " << rc << "n"
将允许只需要知道非0时的函数结果代码的人防止rc污染作用域。但在你的情况下,你说你不需要这个变量。由于按照问题中所述对检查进行编码也是没有意义的(if (x = 5)
总是正确的),我假设您实际上想要测试函数的结果。
综合来看,您只需要执行if (func())...
。
回答我的问题,我使用的是g++版本4.8.5,
如果在宏中声明变量,例如:
#define Macro1
if(int x = 5)
可以在同一范围内多次调用此宏。
如果在同一范围内多次调用,则不带if条件的声明将由于重新定义而引发错误,例如:
#define Macro2
int x = 5; (compile error due to redefinition)
与Visual Studio不同,g++不允许在if条件中声明静态变量。现在想想,我不确定以下几行是否有任何不同的含义:
if( int x = 5 ) compared to if( staitc int x = 5 )
我相信他们的范围刚好在If条件之内。如果有人知道,请告诉我!
您可以通过语句表达式实现这一点
至少在gcc 上
if( ( { static ChannelSettingStruct* channel_settings = SingletonClass()->Instance()->GetSettings(ChannelID)); channel_settings; } ) )
{
...
}
- 用C++中的一个变量定义一个常量
- 一个变量的输入值也会保存到另一个变量中
- 将双精度变量设置为另一个变量的值
- 对具有相同方法的不同类使用一个变量
- 为什么一个变量获得与另一个值相同的值
- 尝试在 C++ 中为 ifstream 提供一个变量
- 类中的一个变量显示,但另一个不显示
- 声明一个变量,该变量在 c++ 或 c 中具有值,当程序终止时不会被销毁
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何将一个变量用于父类和派生类
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 迭代器或反向器的一个变量
- fstream库,试图创建一个变量名为(c++)的文件
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何将一些变量放在一个变量中?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何用索引命名一个变量来存储输入 mxArray?