标签: preprocessor-directive

#define, #ifdef #undef #endif

我有以下代码

#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

我认为原因可能是您只能在编译时定义和取消定义,而不能在运行时定义和取消定义。不过,我不太确定。

c visual-studio-2008 c-preprocessor preprocessor-directive

2
推荐指数
1
解决办法
1万
查看次数

程序执行总是从C中的main开始吗?

必须从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.

c pragma c-preprocessor preprocessor-directive

2
推荐指数
1
解决办法
1万
查看次数

你能在C/C++ include指令中使用环境变量吗?

假设我有一个文件夹布局:

.
+-- 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就是可以做到这一点的工具.或者这被认为是不好的做法?

c++ linux include preprocessor-directive

2
推荐指数
1
解决办法
5205
查看次数

gcc预编译器指令__attribute __((__ cleanup__))vs((清理))(vs没有下划线?)

我正在学习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预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?

macros c-preprocessor preprocessor-directive

2
推荐指数
2
解决办法
613
查看次数

在遇到用户创建的错误后,如何以编程方式强制编译器停止编译过程?

在我的代码中,我使用#error预处理器指令来创建错误。然而,它仍在继续建设过程。

遇到错误后,如何以编程方式强制停止构建过程?

我正在使用适用于 Windows 10 的 Microsoft Visual Studio 2015、C++ v140、x86。

c++ c-preprocessor preprocessor-directive

2
推荐指数
1
解决办法
3440
查看次数

交叉文件#if和#endif - 它应该合法吗?

根据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)

那么标准指定的行为是什么?

c c++ c-preprocessor preprocessor-directive c11

2
推荐指数
1
解决办法
368
查看次数

比较字符串时返回1时出错

任何人都可以告诉我为什么当我尝试使用我的定义错误宏返回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)

c c-preprocessor preprocessor-directive

2
推荐指数
1
解决办法
59
查看次数

(#ifdef)与(#define &lt;boolean&gt;)

我试图找出哪种做法是最好的:

#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中每次对其进行检查。

c preprocessor-directive

2
推荐指数
1
解决办法
55
查看次数

Vuejs &lt;keep-alive&gt; 的重点是什么?

基本上,它说的是什么。重点是<keep-alive>什么?这听起来可能很愚蠢,但我认为目的是缓存与当前未在 DOM 中呈现的组件关联的数据。根据这个bug /问题<keep-alive>专门设计来降时的元素从网页上删除原持有的缓存。那么我错过了什么?

我为什么要使用<keep-alive>with v-showv-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)

javascript preprocessor-directive vue.js vuejs2

2
推荐指数
1
解决办法
1587
查看次数

使用预处理指令 #define for long long

#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 有什么问题。

c++ long-long preprocessor-directive c++14

2
推荐指数
1
解决办法
158
查看次数