C++主要是C的超集,但并非总是如此.特别是,虽然C和C++中的枚举值都隐式转换为int,但反之则不然:只有在C中,int会转换回枚举值.因此,通过枚举声明定义的bitflags无法正常工作.因此,这在C中是可以的,但在C++中则不行:
typedef enum Foo
{
Foo_First = 1<<0,
Foo_Second = 1<<1,
} Foo;
int main(void)
{
Foo x = Foo_First | Foo_Second; // error in C++
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何有效和正确地处理这个问题,理想情况下不会损害使用Foo作为变量类型的调试器友好性质(它会分解为手表中的组件位标志等)?
还要考虑可能有数百个这样的标志枚举,以及数千个使用点.理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是高效的; 我想到的应用程序是受计算限制的,并且具有快速的声誉.
澄清:我正在将一个大型(> 300K)C程序翻译成C++,所以我在运行时和开发人员时间都在寻找有效的翻译.只需在所有适当位置插入演员阵容可能需要数周时间.
我的应用程序中有5个状态,我使用BOOL标记来标记它们.但这并不简单,因为当我想改变状态时,我必须写5行来改变所有标志.
你能写一些想法或简单的代码来解决这个问题吗?
码:
//need to choose second state
flag1 = false;
flag2 = true;
flag3 = false;
flag4 = false;
flag5 = false;
Run Code Online (Sandbox Code Playgroud)
而且,这很糟糕,因为我可以一次选择2个状态.
PS 我发现现代和更多Apple方式.答案如下.
在我的菜单中,我有一些项目.Home是我希望成为我的应用程序的根目录的项目,每当用户点击它时,Android清除堆栈然后返回到主屏幕.
这是我的代码:
menu.setOnItemClickedListener(new MenuClickedListener() {
public void eventOccured(int id) {
Intent intent = null;
switch(id) {
case 1: intent = new Intent(context, More.class); break;
case 2: intent = new Intent(context, FavoriteScreen.class); break;
case 3: intent = new Intent(context, VideoShowList.class); break;
case 4: intent = new Intent(context, ShoppingList.class); break;
case 5: intent = new Intent(context, MainScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
break;
}
if(intent != null)
context.startActivity(intent);
}
});
Run Code Online (Sandbox Code Playgroud)
菜单工作正常,但似乎标志不起作用,因为从主屏幕,我去第二和第三屏幕然后我点击菜单的主页项目,并回到主屏幕.现在,当我点击后退按钮时,我会转到第三个屏幕,第二个屏幕和主屏幕.
我将此菜单设计为窗口小部件,以便将其设置一次并在我的所有屏幕上重复使用它.
任何建议,将不胜感激.谢谢.
我有一个活动启动异步任务,侦听来自服务器的消息.当用户点击主页按钮时,活动暂停,异步任务继续在后台运行.当某个消息到达时,我希望活动恢复并在不重新创建的情况下到达前面.我尝试了以下内容.
机器人:launchMode = "singleTop"
intent = new Intent(getBaseContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这会将活动带到前面,但会重新启动活动.
我也试过了
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Run Code Online (Sandbox Code Playgroud)
但这些都没有将活动带到前线.
什么是恢复应用程序的正确标志,如果我从主屏幕重新启动它会发生什么.
我用Scapy用Python做了一个简单的portscanner.
我设置Metasploitable并打开多个端口,例如.21,22,23和8009.
然后我启动了portscan vs那些端口,Scapy确实告诉我它们是开放的.
但是,如果我扫描Metasploitable上未打开的端口,我会返回TCP标志20,这是URG TCP标志.这是从URG标志的描述中取出的.
URG标志用于通知接收站段内的某些数据是紧急的并且应该优先.如果设置了URG标志,则接收站将评估紧急指针,即TCP标头中的16位字段.该指针指示从第一个字节开始计算的段中有多少数据是紧急的.
对我来说,紧急数据并没有真正响起.
我不明白为什么我得到了URG标志回来,我正在寻找的,为什么我明白了,这意味着什么,即使该端口是关闭的理解,我能永远得到URG响应回来,如果该端口是开放的.
什么是SDL_WindowFlags SDL_WINDOW_INPUT_FOCUS和SDL_WINDOW_MOUSE_FOCUS用于?
如果我没有弄错,SDL_WINDOW_INPUT_GRABBED指示哪个窗口正在接收输入,如果有的话.但我根本看不出其他两个标志是什么意思.我检查了SDL_video.h以查看是否可以获得更多信息,但我读到的内容没有帮助:
SDL_WINDOW_INPUT_GRABBED = 0x00000100, /**< window has grabbed input focus */
SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */
SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */
Run Code Online (Sandbox Code Playgroud)
我没有看到"窗口抓住输入焦点"和"indow有输入焦点"之间的区别.
INPUT_FOCUS仅用于键盘输入,MOUSE_FOCUS用于鼠标输入吗?在这种情况下,为什么INPUT_GRABBED不是这两者的组合?
此外,是否可以有一个鼠标焦点的窗口和另一个具有"输入"焦点的窗口(无论"输入"在这里意味着什么,除了"鼠标"),或类似的东西?
我想知道AM_LDFLAGS和LDFLAGS之间有什么区别,因为我遇到了一个错误
error: AM_LDFLAGS must be set with '=' before using '+='
Run Code Online (Sandbox Code Playgroud)
当我在foreach循环中使用AM_LDFLAGS时,我的make文件代码如下所示:
program_INCLUDE_DIRS := /usr/bin/PR__bin
program_LIBRARY_DIRS := /usr/lib/PR__lib
CFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
AM_LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
Run Code Online (Sandbox Code Playgroud) 如果枚举值为(A | B | C),我需要一个可见的控件.
我知道如何使用转换器将控件的可见性绑定到SINGLE枚举(A).
在这种情况下,我该如何做同样的事情呢?参数会怎么样?
这是我使用的转换器:
public class EnumToVisibilityConverter : IValueConverter {
public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
if ( value == null || parameter == null || !( value is Enum ) )
return Visibility.Hidden;
string State = value.ToString( );
string parameterString = parameter.ToString( );
foreach ( string state in parameterString.Split( ',' ) ) {
if ( State.Equals( state ) )
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack( …Run Code Online (Sandbox Code Playgroud) 我有一个标签设置为相对定位和自动尺寸,如下所示
<Style TargetType="Label">
<Setter Property="BackgroundColor" Value="Transparent" />
//Something like below?
<Setter Property="AbsoluteLayout.LayoutFlags" Value="PositionProportional | SizeProportional" />
</Style>
....
<Label Text="0" AbsoluteLayout.LayoutBounds="0.5, 0.00499999999999998, AutoSize, AutoSize"/>
Run Code Online (Sandbox Code Playgroud)
有没有办法在XAML中指定多个LayoutFlags?
当我在具有更高分辨率的设备上运行代码时,标签的相对位置是正确的,但标签的大小(字体)不会增加,尽管它设置为AutoSize.我想我还需要为SizeProportional和PositionProportional指定一个LayoutFlag.但是如何在XAML中做到这一点?目前,当设备旋转到横向时,字体不会调整大小.
我已经通过3.0.0-rcX(来自Canary频道)到达Android Studio 3.0.0(来自稳定频道).
当我启动一个全新的应用程序并构建它时,以下代码(在应用程序内)显示已设置FLAG_TEST_ONLY标志.
Log.e(TAG, "ApplicationInfo: " + (getApplicationInfo().flags & ApplicationInfo.FLAG_TEST_ONLY));
10-31 09:54:05.226 16129-16129/com.example.dummy E/MainActivity: ApplicationInfo: 256
Run Code Online (Sandbox Code Playgroud)
该应用程序的清单是:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dummy">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
该标志使设备策略控制器无法安装它:使用设备策略控制器在后台升级应用程序
为什么设置此标志,以及如何阻止它被设置?