Tag: const

使用const参数将参数传递给函数:它更快吗?

例如,考虑一下: int sum(int a, int b) { return a + b; } 与 int sum(const int a, const int b) { return a + b; } 第二种方法通常更快吗? C中的函数参数被复制并发送到函数,因此函数内部的更改不会影响原始值。 我的理由是,在上面的第二个sum ,编译器确定a和b在函数内部没有被修改,所以它可以只传递原始值而不先复制它们。 这就是为什么我认为第二个sum比第一个快。 但我真的不知道。 在上面sum的特定简单示例中,差异(如果有的话)应该是最小的。 编辑: sum例子只是为了说明我的观点。 我不认为在这个特定的例子中应该有很大的差异。 但我想知道在更复杂的情况下,编译器是否可以利用函数参数中的const修饰符来使函数更快。 我怀疑编译器总能确定参数是否在函数内被更改(因此我的第二个问题在下面); 因此我希望当它找到一个const修饰符时,它会做出与没有const修饰符时不同的东西。 问题:一般来说,当一个函数的参数是const时,函数会比它们不是时更快吗? 问题2:通常,C编译器(理论上)是否总能确定函数内是否更改了函数参数?

C中const的外部链接

当我遇到这种奇怪的行为时,我正在使用C中的 extern关键字。 我有两个文件: 在file1.c #include int main() { extern int a; a=10; printf(“%d”,a); return 0; } file2.c中 const int a=100; 当我一起编译这些文件时,没有错误或警告,当我运行它们时,输出变为10 。 我原以为编译器应该在a=10;行报告错误a=10; 。 此外,如果我将file2.c的内容更改为 const int a; 也就是说,如果我删除全局const变量a的初始化然后编译文件,仍然没有错误或警告,但是当我运行它们时,会发生分段错误。 为什么会出现这种现象? 它是否归入未定义的行为? 这是编译器还是机器依赖的? PS:我看过很多与此问题相关的问题,但要么是C ++,要么只讨论extern 。

类型限定符对存储位置的影响

正如标题中所提到的,如果type-qualifiers影响声明bss的存储位置( stack , bss等),我很困惑。为了描述更多,我正在考虑以下声明。 int main() { const int value=5; const char *str= “Constant String”; } 在上面的代码中,默认的storage-class-specifier是auto 。 因此,假设这些常量将在创建时在main的stack-frame中分配。 通常, pointers堆栈中各种存储器位置的pointers可以自由地修改其中包含的值。 因此,从以上几点可以理解, type-qualifier添加了一些逻辑来保存所存储元素的constant性质(如果是这样的话是什么?)或者constants存储在存储器的read-only-portion中。 请详细说明 。 更详细的例子 #include int main(void) { int val=5; int *ptr=&val; const int *cptr=ptr; *ptr=10; //Allowed //*cptr=10; Not allowed //Both ptr and cptr are pointing to same locations. But why the following […]

C – 使用execvp和用户输入

我正在尝试让我的C程序从用户那里读取Unix参数。 到目前为止,我一直在搜索这个网站,但是我还没弄清楚到底我做错了什么 – 尽管我的指针实现技能相当有限。 以下是我现在的代码方式; 我一直在乱搞指针而没有运气。 错误也说我需要使用const * char,但我在其他例子中看到* char可以由用户输入。 #include #include #include #include main() { char args[128]; //User input printf(“> “); fgets(args, 128, stdin); execvp(args[0], *args[0]); } 我得到的错误如下: smallshellfile.c: In function ‘main’: smallshellfile.c:13:21: error: invalid type argument of unary ‘*’ (have ‘int’) smallshellfile.c:13:5: warning: passing argument 1 of ‘execvp’ makes pointer from integer without […]

通过非const指针修改const int

#include int main(){ const int a = 10; *(int*)(&a) = 9; // modify a printf(“%d”, a); return 0; } 当我在Xcode上运行此代码时,输​​出为10(未更改) 当我在Visual Studio社区上运行此代码时,输​​出为9(已更改) 为什么?

const volatile指针函数参数

对于嵌入式SW项目,我们需要使用一些const volatile TYPE *指针。 现在我们有一些计算函数,如下所示: uint8 calc(const volatile uint8 *array, uint8 value) { … } 在函数执行期间,两个变量的数据都没有变化。 调用代码如下所示: const volatile uint8 *array = (const volatile uint8 *)0x00010111; uint8 value = 8; uint8 result = calc(array, value); 现在的问题是,如果我们设计没有volatile参数的calucation函数会有区别: uint8 calc(const uint8 *array, uint8 value) { … } 对于电话,我们抛弃了波动: uint8 result = calc((const uint8 *)array, value); 第二种解决方案的优点是更灵活:我们也可以将该函数用于非易失性变量。 但它是否有所作为,如果我们抛弃volatile并且我们的编译器做了一些强有力的优化?

const char **和char **

代码1:没有警告,没有错误。 工作完美。 #include void printP(const char *p) { printf(“const char *p is : %p\n”,p); if( p ) printf(“%s\n”,p); } void printP2P(const char **p) { printf(“const char **p pointer to : %p\n”,*p); if( p &&(*p) ) printf(“%s\n”,*p); } int main() { char a[] = “Hello World”; const char *p = a; const char **p2p = &p; […]

你如何在C中定义常量?

我正在尝试构建一个开关,我得到一个“表达式必须有整数或枚举类型”。 我猜winapi中的切换不采用LPSTR类型的变量? char testbuf[ 51 ]; // allocate space for 50 characters + termination LPSTR test = testbuf; scanf(“%50s”, test); // read at most 50 characters printf(“%s”, test); switch ( test ) { case “etc” : { } break;

如何消除将多维数组作为const多维数组传递的警告?

给出以下代码: /* signatures */ int getParams(char params[MAX_PARAM_LEN][MAX_LINE_LEN]); int getVersion(const char params[MAX_PARAM_LEN][MAX_LINE_LEN], const char* tagName ); /* initializing */ char params[MAX_PARAM_LEN][MAX_LINE_LEN] = {}; /* getting parameters */ paramCount = getParams(params); /* OK, params match with getParams signature */ /* processing the params array */ i = getVersion(params, “version”); /* warning: passing arg 1 of `getVersion’ from […]

const指针修复变量变量

我无法弄清楚如何告诉C我想要一个不会移动的指针。 它总是指向同一个数组。 也就是说,数组成员不是常量,但数组本身是全局的,因此,它处于固定位置。 所以,当我编码时: #include int v[2]={0, 1}; const int *cpv=v; int main(void) { v[1]=2; printf(“%d\n”, v[1]); *(cpv+1)=3; printf(“%d\n”, v[1]); cpv[1]=4; printf(“%d\n”, v[1]); } 并得到这个错误: constp.c: In function ‘main’: constp.c:9: error: assignment of read-only location ‘*(cpv + 4u)’ constp.c:10: error: assignment of read-only location ‘*(cpv + 4u)’ 我知道编译器认为我需要一个const int v[2]来使用const int *iv 。 如何获得一个常量指针来完成这项工作? 如果你看到错误信息,我甚至没有移动指针(如pv++ […]