我有以下代码
#define PROC_ADD
void main(void)
{
while(1)
{
#ifdef PROC_ADD
// Do this code here then undefined it to run the code in the else
// processing work
#undef PROC_ADD
#else
// now that PROC_ADD has been undefined run this code
// processing work
#endif
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它将运行代码。但它不会运行未定义else后的代码。PROC_ADD
我认为原因可能是您只能在编译时定义和取消定义,而不能在运行时定义和取消定义。不过,我不太确定。
必须从main开始执行程序,还是可以修改起始地址?
#include <stdio.h>
void fun();
#pragma startup fun
int main()
{
printf("in main");
return 0;
}
void fun()
{
printf("in fun");
}
Run Code Online (Sandbox Code Playgroud)
此程序in fun之前打印in main.
假设我有一个文件夹布局:
.
+-- Project
+-- src
+-- foo.h
+-- foo.cpp
+-- test
+-- test_foo.c
Run Code Online (Sandbox Code Playgroud)
而且test_foo.c看起来这样的:
#include "../src/foo.h"
#include <stdio.h>
#include <assert.h>
int main() {
assert(foo() == true);
printf("Test complete");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法#include "../src/foo.h"用指向源目录的变量替换该行?例如,在我的环境中说我有一个变量:
PROJECT_SRC="./Project/src/"
Run Code Online (Sandbox Code Playgroud)
然后我可以使用include指令:
#include "PROJECT_SRC/foo.h"
Run Code Online (Sandbox Code Playgroud)
这将是很好的,因为我可以有一个bash脚本导出我需要的某个项目的所有路径.此外,如果文件包含在不同的测试和构建文件中,我将不得不为每个文件设置相对路径(尽管工作量不大),这个路径不如一个绝对路径强大.
另一种选择可能CMake就是可以做到这一点的工具.或者这被认为是不好的做法?
我正在学习gcc的清理属性,并了解当变量超出范围时它如何调用函数运行,我不明白为什么你可以使用带有或不带下划线的"清理"一词.带下划线的版本的文档或文档在哪里?
上面的gcc文档显示如下:
__attribute__ ((cleanup(cleanup_function)))
Run Code Online (Sandbox Code Playgroud)
但是,我读过的大多数代码示例都显示如下:
__attribute__ ((__cleanup__(cleanup_function)))
Run Code Online (Sandbox Code Playgroud)
例如:
请注意,第一个示例链接表明它们是相同的,当然编码证明了这一点,但他最初是如何知道的?这个是从哪里来的?
为什么不同?在哪里__cleanup__定义或记录,而不是cleanup?
我的根本问题在于我不知道我不知道的事实,因此我试图暴露我未知的一些未知因素,以便他们成为众所周知的未知数,直到我能够研究它们并使它们成为已知的知识.
我的想法是,gcc预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?
在我的代码中,我使用#error预处理器指令来创建错误。然而,它仍在继续建设过程。
遇到错误后,如何以编程方式强制停止构建过程?
我正在使用适用于 Windows 10 的 Microsoft Visual Studio 2015、C++ v140、x86。
根据C11标准,
表单的预处理指令
#include"q-char-sequence"换行符
导致由"分隔符"之间的指定序列标识的源文件的全部内容替换该指令.
所以,如果我有一个头文件test.h包含:
#endif
Run Code Online (Sandbox Code Playgroud)
一个源文件test.c包含:
#if 1
#include "test.h"
Run Code Online (Sandbox Code Playgroud)
是否应该根据标准通过更换现有内容来通过预处理阶段test.h?
但我不能这样做clang,其中说:
In file included from test.c:2:
./test.h:1:2: error: #endif without #if
#endif
^
test.c:1:2: error: unterminated conditional directive
#if 1
^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)
那么标准指定的行为是什么?
任何人都可以告诉我为什么当我尝试使用我的定义错误宏返回1时Visual Studio给我一个错误?VS说它期待一个支架:/
#define ERROR "A generic error has occured";
const char *RetAdapters(int *adapters) {
if(...) {}
else
return ERROR;
}
int main()
{
const char *ret = RetAdapters(&input);
if (strcmp(*ret, ERROR) == 0) {
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我试图找出哪种做法是最好的:
#define TEST
//#define TEST commented if not used or simply deleted
Run Code Online (Sandbox Code Playgroud)
#define TEST 1
#define TEST 0 //if not used
Run Code Online (Sandbox Code Playgroud)
为了提高可读性,我更喜欢定义一个“布尔”并在a中对其进行检查,if但是我猜它效率不高,因为它不使用#ifdef并且需要在if中每次对其进行检查。
基本上,它说的是什么。重点是<keep-alive>什么?这听起来可能很愚蠢,但我认为目的是缓存与当前未在 DOM 中呈现的组件关联的数据。根据这个bug /问题,<keep-alive>是专门设计来降时的元素从网页上删除原持有的缓存。那么我错过了什么?
我为什么要使用<keep-alive>with v-show?v-show元素仍然存在于页面上的全部意义不是,只是设置了 CSS 来隐藏它?默认情况下,元素在使用v-show?隐藏时会丢失数据吗?
需要明确的是,以下示例显然应该不起作用(根据我无论如何链接的已关闭错误/问题):
<div v-if="lazyLoaded && userClickedToShow">
<h2>{{someLazyLoadedData.title}}</h2>
<div id="otherStuff">
...
</div>
<keep-alive>
<some-child-component :prop="someLazyLoadedData"></some-child-component>
</keep-alive>
</div>
Run Code Online (Sandbox Code Playgroud)
所以我本来希望<keep-alive>在这种情况下会缓存与<some-child-component>加载后的数据相关联的数据,如果用户点击显示(也许出于性能原因,我不希望在 DOM 中有很多数据,除非用户特别点击以显示它,或其他)它会切换显示,但保留搜索词或组件中发生的任何事情。
有没有办法重写这个符合<keep-alive>应该如何运作的?如果我现在不想渲染它,我是否必须绑定到isa<component>并将其设置为空?像这样的东西?
<keep-alive>
<component :is="lazyLoaded && userClickedToShow ? 'SomeChildComponent' : ''" :prop="lazyLoaded && someLazyLoadedData"></component>
<keep-alive>
Run Code Online (Sandbox Code Playgroud)
这似乎混淆了那里实际发生的事情,如果它甚至有效的话。还假设 thatSomeChildComponent的 prop 可以 take false,它可能无法接受。我不喜欢那个选项。稍微好一点我想是将整个东西包裹在一个if块中,也许?
<div v-if="lazyLoaded">
<keep-alive>
<component …Run Code Online (Sandbox Code Playgroud) #include <iostream>
using namespace std;
#define ll long long
int main() {
int a = 5;
ll maxi = 1;
maxi = max(maxi, maxi * ll(a));
cout<<maxi<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会抛出错误?我不明白 #define ll long long 有什么问题。