Я думал, что отвечу только на один из ваших вопросов, так как другие ответы отвечают на общий вопрос довольно хорошо, но оставили это без внимания.
«Игнорирование ситуации - Да, стандарт идет на то, что это будет иметь «непредсказуемые результаты», но это не то же самое, что и код компилятора, который, как я полагаю, был бы необходимым условием для носовых демонов).
Ситуация в которые можно было бы разумно ожидать от разумного компилятора, без компилятора, вставляющего ЛЮБОЙ код, были бы следующими:
if(!spawn_of_satan)
printf("Random debug value: %i\n", *x); // oops, null pointer deference
nasal_angels();
else
nasal_demons();
Компилятор, если он может доказать, что это * x является null pointer dereference, совершенно прав, как часть некоторой оптимизации, сказать «ОК, поэтому я вижу, что они разыменовали нулевой указатель в этой ветке if. Поэтому, как часть этой ветви, мне разрешено делать что я могу оптимизировать: «
if(!spawn_of_satan)
nasal_demons();
else
nasal_demons();
« И оттуда я могу оптимизировать это: «
nasal_demons();
Вы можете видеть, как этот вид вещь может я n правильные условия оказываются очень полезными для оптимизирующего компилятора и при этом вызывают катастрофу. Я видел некоторые примеры в нескольких случаях, когда на самом деле для оптимизации важно, чтобы можно было оптимизировать этот случай. Я мог бы попытаться выкопать их позже, когда у меня будет больше времени.
EDIT: Один пример, который только что пришел из глубины моей памяти о таком случае, когда это полезно для оптимизации, вы часто проверяете указатель на наличие NULL (возможно, в встроенных вспомогательных функциях), даже после того, как он уже разыменовал его и не изменил его. Оптимизирующий компилятор может видеть, что вы разыменовали его, и поэтому оптимизируйте все проверки «is NULL», поскольку, если вы разыменовали его и он имеет значение NULL, что-либо разрешено, в том числе просто не выполняется «NULL», чеки. Я считаю, что подобные аргументы применимы и к другому неопределенному поведению.
Вот класс, извлеченный из приложения, которое я написал год или два назад:
public sealed class Wallpaper
{
Wallpaper() { }
const int SPI_SETDESKWALLPAPER = 20;
const int SPIF_UPDATEINIFILE = 0x01;
const int SPIF_SENDWININICHANGE = 0x02;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
public enum Style : int
{
Tiled,
Centered,
Stretched
}
public static void Set(Uri uri, Style style)
{
System.IO.Stream s = new System.Net.WebClient().OpenRead(uri.ToString());
System.Drawing.Image img = System.Drawing.Image.FromStream(s);
string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp");
img.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp);
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop", true);
if (style == Style.Stretched)
{
key.SetValue(@"WallpaperStyle", 2.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Centered)
{
key.SetValue(@"WallpaperStyle", 1.ToString());
key.SetValue(@"TileWallpaper", 0.ToString());
}
if (style == Style.Tiled)
{
key.SetValue(@"WallpaperStyle", 1.ToString());
key.SetValue(@"TileWallpaper", 1.ToString());
}
SystemParametersInfo(SPI_SETDESKWALLPAPER,
0,
tempPath,
SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
}
}
Я не тестировал его тщательно, поэтому используйте его на свой страх и риск.
При использовании UWP в c# вот код, который я нашел здесь
using Windows.System.UserProfile;
// Pass in a relative path to a file inside the local appdata folder
async Task<bool> SetWallpaperAsync(string localAppDataFileName)
{
bool success = false;
if (UserProfilePersonalizationSettings.IsSupported())
{
var uri = new Uri("ms-appx:///Local/" + localAppDataFileName);
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(uri);
UserProfilePersonalizationSettings profileSettings = UserProfilePersonalizationSettings.Current;
success = await profileSettings.TrySetWallpaperImageAsync(file);
}
}
На самом деле, я думаю, что это может быть более просто , file.png является фотографией, это может быть .jpg или что-то еще
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("file.png", CreationCollisionOption.ReplaceExisting);
bool success = false;
UserProfilePersonalizationSettings profileSettings = UserProfilePersonalizationSettings.Current;
success = await profileSettings.TrySetWallpaperImageAsync(file);