我从教育/黑客的角度来问这个问题,(我真的不想这样编码).
是否可以仅使用C预处理程序指令实现while循环.我知道宏不能递归扩展,那么如何实现呢?
我想知道是否有可能迭代传递给C99中的可变参数宏或使用任何GCC扩展的参数?
例如,是否可以编写一个通用的宏,它接受一个结构,并将其字段作为参数传递,并打印结构中每个字段的偏移量?
像这样的东西:
struct a {
int a;
int b;
int c;
};
/* PRN_STRUCT_OFFSETS will print offset of each of the fields
within structure passed as the first argument.
*/
int main(int argc, char *argv[])
{
PRN_STRUCT_OFFSETS(struct a, a, b, c);
return 0;
}
我想知道是否有可能有预处理器OR或AND语句?我有这个代码,我想在其下运行_DEBUG或_UNIT_TEST标签(?).
我想要的是以下内容:
#if _DEBUG || _UNIT_TEST
//Code here
#endif
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,有没有一种解决方法来实现相同的事情,而不必使用#elseif?
1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
Run Code Online (Sandbox Code Playgroud)
当我只运行预处理器时,输出文件包含20.
但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):
所以我认为输出应该是10而不是20.可以解释它出错的地方吗?
我今天遇到了这种语法,无法理解其含义:
// Uses the GNU C statement expression extension
#define envSet(name) ({ \
static int initialised; \
static bool set; \
(void) "" name; \
if (!initialised || !g_cacheEnv) { \
const char *value = getenv(name); \
set = value != NULL; \
initialised = true; \
} \
set; \
})
Run Code Online (Sandbox Code Playgroud)
我无法理解的具体路线是:
(void) "" name; \
Run Code Online (Sandbox Code Playgroud)
有人可以对此有所了解吗?
C#能否像使用预处理器语句在C编程语言中那样定义宏?我想简化某些重复语句的常规输入,如下所示:
Console.WriteLine("foo");
Run Code Online (Sandbox Code Playgroud) 我正在尝试以编程方式#include在Linux上找到路径,据我所知,在实践中意味着找到GCC认为它的内容.(这是真的吗?Clang怎么做?)
根据http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html,一些组件涉及CPU架构和GCC版本; 后者尤其显得棘手; 我想它可以通过运行gcc --version和解析输出(或gcc -v)来获得,但这看起来不够优雅,最糟糕的是脆弱.假设一个程序正在使用GCC编译,从一个代码中执行它可能是另一种选择,但它需要依赖于该假设.
建议的方法是什么?
我有一个非常大的代码库(读取:数千个模块),它们在许多项目中共享代码,这些代码都运行在具有不同C++编译器的不同操作系统上.毋庸置疑,维护构建过程可能相当繁琐.
在代码库中有几个地方可以清理代码,只要有一种方法可以让预处理器忽略#includes当前文件夹中不存在的文件.有谁知道实现这一目标的方法?
目前,我们使用了一个#ifdef围绕#include在共享文件,与该#define语句是否没有第二个项目特定的文件#include存在于该项目.这有效,但很难看.人们在添加或删除项目中的文件时经常忘记正确更新定义.我已经考虑过编写一个预构建工具来保持这个文件是最新的,但是如果有一个独立于平台的方法来对预处理器做这个,我宁愿那样做.有任何想法吗?
我想知道C预处理器如何处理循环依赖(#defines).这是我的计划:
#define ONE TWO
#define TWO THREE
#define THREE ONE
int main()
{
int ONE, TWO, THREE;
ONE = 1;
TWO = 2;
THREE = 3;
printf ("ONE, TWO, THREE = %d, %d, %d \n",ONE, TWO, THREE);
}
Run Code Online (Sandbox Code Playgroud)
这是预处理器输出.我无法弄清楚为什么输出是这样的.我想知道预处理器在这种情况下采取的各种步骤,以提供以下输出.
# 1 "check_macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "check_macro.c"
int main()
{
int ONE, TWO, THREE;
ONE = 1;
TWO = 2;
THREE = 3;
printf ("ONE, TWO, THREE = %d, %d, %d \n",ONE, TWO, THREE); …Run Code Online (Sandbox Code Playgroud) 我认为这个问题很清楚.我正在尝试编写一个编译器检测头,以便能够在应用程序中包含有关使用哪个编译器和哪个版本的信息.
这是我正在使用的代码的一部分:
/* GNU C Compiler Detection */
#elif defined __GNUC__
#ifdef __MINGW32__
#define COMPILER "MinGW GCC %d.%d.%d"
#else
#define COMPILER "GCC %d.%d.%d"
#endif
#define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
#endif
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
printf(" Compiled using " COMPILER "\n", COMP_VERSION);
Run Code Online (Sandbox Code Playgroud)
有没有办法检测LLVM及其版本?和CLANG?